如何使用networking/xhr 查找此页面的表格内容?
Posted
技术标签:
【中文标题】如何使用networking/xhr 查找此页面的表格内容?【英文标题】:How to use networking/xhr to find the tables content of this page? 【发布时间】:2020-03-29 20:46:39 【问题描述】:我正在尝试使用以下代码访问此页面上下表的内容:https://cdn.ime.co.ir
通过此代码:
import requests
with requests.Session() as s:
data = 'ContractCode' : 'SAFOR99'
r = s.post('https://cdn.ime.co.ir/home/load/' , json = data ).json()
print(r)
但我在结果中看到的是:
JSONDecodeError: 期望值
请帮助我知道如何阅读此表的内容?
【问题讨论】:
帖子的响应不是json文件,也不是你要找的 【参考方案1】:数据不在 html 内容中,而是通过 API 检索,更具体地说,协议是 websocket。您可以使用 Chrome 开发工具检查框架并在 wss 上进行过滤以找到以下网址:wss://cdn.ime.co.ir/realTimeServer/connect
有多个必要的查询参数,包括connectionToken
,它是通过https://cdn.ime.co.ir/realTimeServer/negotiate
上的rest API 获取的。
打开 websocket 后,您不会收到太多数据,直到您使用相同的 ConnectionToken 值对https://cdn.ime.co.ir/realTimeServer/start
执行另一个休息请求。之后,服务器向您发送 JSON 数据
以下代码执行上述所有任务,您将获得result
未过滤列表中的数据:
import requests
import json
import asyncio
import websockets
import urllib
import random
from threading import Thread
connectionData = ["name":"marketshub"]
r = requests.get("https://cdn.ime.co.ir/realTimeServer/negotiate", params =
"clientProtocol": "2.1",
"connectionData": json.dumps(connectionData),
)
response = r.json()
print(f'got connection token : response["ConnectionToken"]')
wsParams =
"transport": "webSockets",
"clientProtocol": "2.1",
"connectionToken": response["ConnectionToken"],
"connectionData": json.dumps(connectionData),
"tid": random.randint(0,9)
websocketUri = f"wss://cdn.ime.co.ir/realTimeServer/connect?urllib.parse.urlencode(wsParams)"
def startReceiving(arg):
r = requests.get("https://cdn.ime.co.ir/realTimeServer/start", params = wsParams)
print(f'started receiving data : r.json()')
result = []
async def websocketConnect():
async with websockets.connect(websocketUri) as websocket:
print(f'started websocket')
thread = Thread(target = startReceiving, args = (0, ))
thread.start()
for i in range(0,10):
print("receiving")
data = await websocket.recv()
jsonData = json.loads(data)
if ("M" in jsonData and len(jsonData["M"]) > 0 and "A" in jsonData["M"][0] and len(jsonData["M"][0]["A"]) > 0):
items = jsonData["M"][0]["A"][0]
if type(items) == list and len(items) > 0:
result = items
break
thread.join()
print(json.dumps(result, indent=4, sort_keys=True))
asyncio.get_event_loop().run_until_complete(websocketConnect())
然后您可以使用以下方法获取SAFOR99
项目:
print([i for i in result if i["ContractCode"] == "SAFOR99"])
【讨论】:
非常感谢您的帮助!但是当我运行你的程序时,我得到了RuntimeError: This event loop is already running
奇怪我的机器上没有这个问题,也许你可以用this method测试
我正在尝试在 Spyder IDE 中运行该程序并收到此错误。也不知道为什么result
是空的。以上是关于如何使用networking/xhr 查找此页面的表格内容?的主要内容,如果未能解决你的问题,请参考以下文章
出现无法显示此页。确保Web地址正常。使用搜索引擎查找页面。请过几分钟后刷新页面