Python web-socket 解释(读取)数据

标签 python sockets websocket

尝试尝试并了解有关网络抓取套接字的更多信息。

我正在尝试通过 WebSockets 从网站传输信息。我能够接收数据,但想知道读取和解释从中传入的数据的正确方法是什么。

我使用的是Python 3.7。我能够使用 https://towardsdatascience.com/scraping-in-another-dimension-7c6890a156da 中的示例来设置连接 我正在尝试获取一些股票价格数据显示在https://finance.yahoo.com/quote/BTC-USD/chart上通过套接字。 enter image description here 这是我正在使用的代码:

import websocket
import json
from websocket import create_connection


headers = json.dumps({
    'Accept-Encoding':'gzip deflat,br',
    'Accept-Language':'en-US,en;q=0.9,zh-TW;q=0.8,zh;q=0.7,zh-CN;q=0.6',
    'Cache-Control': 'no-cache',
    'Connection': 'Upgrade',

    'Host': 'streamer.finance.yahoo.com',
    'Origin': 'https://finance.yahoo.com',
    'Pragma': 'no-cache',
    'Sec-WebSocket-Extensions': 'permessage-deflate; client_max_window_bits',
    'Sec-WebSocket-Key': 'VW2m4Lw2Rz2nXaWO10kxhw==',
    'Sec-WebSocket-Version': '13',
    'Upgrade': 'websocket',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
    })

ws = create_connection('wss://streamer.finance.yahoo.com/',headers=headers)

ws.send('{"subscribe":["^GSPC","^DJI","^IXIC","^RUT","CL=F","GC=F","SI=F","EURUSD=X","^TNX","^VIX","GBPUSD=X","JPY=X","BTC-USD","^FTSE","^N225"]}')


while True:
    result  = ws.recv()
    print(result)

ws.close()

这使我能够得到如下结果:

CgReREpJFebCzkYYwJHv8LZbKgNESkkwCTgBRWYd6D5I7tDaigFlAOHuQtgBBA==
CgVKUFk9WBUX2ddCGMCR7/C2WyoDQ0NZMA44AUUVH9w+ZQCM7D7YAQg=
CghFVVJVU0Q9WBVA2Yw/GMCR7/C2WyoDQ0NZMA44AUXuDJI+ZQAgTTvYAQg=
CghHQlBVU0Q9WBUQO58/GMCR7/C2WyoDQ0NZMA44AUXz/fY/ZcDrwDzYAQg=
CgReVklYFYXrkUEYgKOB8LZbKgNXQ0IwCTgBRcRWCcBlwMzMvtgBBA==
CghHQlBVU0Q9WBUVOp8/GJCh7/C2WyoDQ0NZMA44AUWcrfY/ZQCtwDzYAQg=
CgVKUFk9WBUv3ddCGJCh7/C2WyoDQ0NZMA44AUVQ7t8+ZQCk8D7YAQg=
CghFVVJVU0Q9WBU424w/GJCh7/C2WyoDQ0NZMA44AUWi2pQ+ZQAQUTvYAQg=

不确定如何解释我收到的数据,或者网络浏览器如何解释这些数据。浏览器似乎正在接收与我相同的数据。

最佳答案

我的猜测是这是 Protobuf 编码的数据。通过查看雅虎财经页面的 Javascript 源代码,您可以看到,一旦订阅了股票行情,就会通过解码例程处理回复。

https://finance.yahoo.com/__finStreamer-worker.js

...在下面的代码片段中,有一个从 Base64 文本到字节,然后到 Javascript 对象(类型为 PricingData)的清晰转换。请注意提到了 protobuf。

QuoteStreamer.prototype.handleWebSocketUpdate = function (event) {
    try {
        var PricingData = protobuf.roots.default.quotefeeder.PricingData;
        var buffer = base64ToArray(event.data); // decode from base 64
        var data = PricingData.decode(buffer); // Decode using protobuff
        data = PricingData.toObject(data, { // Convert to a JS object
            enums: String
        });

您接下来需要弄清楚的是 Yahoo 使用的 Protobuf 模式(然后它允许您用 Python 生成解码器),但我不确定它是否是公开的。不过,您可以检查它们生成的用于执行解码的实际 Protobuf Javascript 代码,并尝试直接在 Python 中复制它,或者猜测 protobuf 架构。

Javascript 解码器在这里:https://finance.yahoo.com/__finStreamer-proto.js

关于Python web-socket 解释(读取)数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58330057/

相关文章:

Python Pandas : Highlight matching text and row

python - 如何使用多个打印参数将打印重定向到日志记录?

python - 在 linux 上修改传出 UDP 数据包中的数据

java - 在Android上通过OkHttp连接到websocket时如何捕获UnknownHostException?

javascript - Node.js、Websocket 服务器端客户端数据

python - 如何使用 Pyspark Streaming 模块实现 RabbitMQ 消费者?

python - Tensorflow 对象检测 API 中的数据增强

java - kafka.consumer.SimpleConsumer : Reconnect due to socket error: java. nio.channels.ClosedChannelException 异常

java - 简单的服务器/客户端套接字连接?

c# - 炼金术网络套接字 : Can't host server on Azure