Интерпретация (чтение) данных веб-сокета Python - PullRequest
0 голосов
/ 10 октября 2019

Пытаюсь поэкспериментировать и узнать больше о сокетах для очистки веб-страниц.

Я пытаюсь передавать информацию с веб-сайта через 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=

Не уверен, как интерпретироватьданные, которые я получаю, или как веб-браузер интерпретирует эти данные. Похоже, что браузер получает те же данные, что и я.

1 Ответ

1 голос
/ 12 октября 2019

Я предполагаю, что это данные, закодированные в Protobuf. Вы можете увидеть, посмотрев исходный код Javascript для финансовой страницы Yahoo, после подписки тикера ответы обрабатываются с помощью процедуры декодирования.

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

... в следующем фрагменте происходит четкое преобразование текста base64 в байты, а затем в объект Javascript (типа PricingData). Обратите внимание на упоминание о protobuf. * ​​1007 *

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
        });

Далее вам необходимо выяснить схему Protobuf, используемую Yahoo (которая затем позволяет генерировать декодер в Python), но я не уверен, что это так. общественности. Однако вы можете проверить фактический код Javascript Protobuf, который они сгенерировали для выполнения декодирования, и попытаться напрямую скопировать его в Python или сделать предположение о схеме protobuf. * ​​1010 *

Декодер Javascript находится здесь: https://finance.yahoo.com/__finStreamer-proto.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...