如何使用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地址正常。使用搜索引擎查找页面。请过几分钟后刷新页面

帮助查找此 MySQL 页面中的安全漏洞?

如何使用 WinINet 查找网页是不是存在

使用 selenium 查找输入和按钮元素

如何使用Selenium C#WebDriver查找所有父元素?

如何使用 mpdf 查找剩余页面空间