簡體   English   中英

Python web-socket解釋(讀取)數據

[英]Python web-socket interpreting(reading) Data

嘗試嘗試並了解有關 sockets 的更多信息以進行網絡抓取。

我正在嘗試通過 WebSockets 從網站獲取 stream 信息。 我能夠接收數據,但想知道從其中讀取和解釋傳入數據的正確方法是什么。

我正在使用 Python 3.7。 我能夠使用https://towardsdatascience.com/scraping-in-another-dimension-7c6890a156da中的示例設置連接我正在嘗試獲取一些股票價格數據以顯示在https://finance.com上。 /quote/BTC-USD/chart via sockets。 在此處輸入圖像描述 這是我正在使用的代碼:

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=

不知道如何解釋我收到的數據,或者 web 瀏覽器如何解釋這些數據。 似乎瀏覽器正在接收與我相同的數據。

我的猜測是這是 Protobuf 編碼的數據。 通過查看 yahoo 財務頁面的 Javascript 源代碼,您可以看到,一旦訂閱了代碼,回復將由解碼例程處理。

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

...在以下代碼段中,有一個從 base64 文本到字節然后到 Javascript object (類型為 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

這確實是一個 protobuf 編碼的數據。 Maxim可以從中編寫一個 protobuf 文件。

我創建了一個python package可以做到這一點。 你需要做的就是

  1. 安裝它
    pip install yliveticker
  1. 導入它並獲得解碼結果
    import yliveticker


    # this function is called on each ticker update
    def on_new_msg(msg):
        print(msg)


    # insert your symbols here
    yliveticker.YLiveTicker(on_ticker=on_new_msg, ticker_names=[
    "BTC=X", "^GSPC", "^DJI", "^IXIC", "^RUT", "CL=F", "GC=F", "SI=F", "EURUSD=X", "^TNX", "^VIX", "GBPUSD=X", "JPY=X", "BTC-USD", "^CMC200", "^FTSE", "^N225"])

隨意貢獻或使用存儲庫作為您項目的示例;)

如果您沒有看到任何數據,請檢查您是否在證券交易所的交易時間內

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM