Python. Используем websocket (WebScrapping) [9]

Предисловие

На некоторых сайтах, данные о ценах предметов приходят по веб-сокету. В данной статье, мы научимся подключаться к веб-сокету на сайте quicksell.store, используя библиотеку websocket-client.

Что такое веб-сокет.

Веб-сокет — это протокол обмена сообщениями между клиентом и сервером.

На русском это значит что это, что-то вроде чата (наподобии ВК), где, например ты:

  • отпраляешь серверу текст «скинь цены предметов»
  • и он отвечает «держи 1 ключ = 1 реф, продавать будешь?»

Сообщения по веб-сокету можно отследить в браузере Mozilla Firefox, используя инструменты разработчика. Теперь. перейдем к делу.

Читаем переписки.

Зайдите на сайт quicksell.store. Откройте инструменты разработчика (F12), зайдите во вкладку Сеть, включите фильтр по веб-сокетам (WS), и обновите страницу.

Выберите любой из вебсокетов, и нажмите на кладку Ответ

Как вы видите, здесь отображены:

  • принятые сообщения (красная стрелка вниз)
  • и переданные сообщения (зеленая стрекла вверх)

Сообщения получены, осталось отправить их через Python скрипт.

Пишем код.

Перед началом, установите библиотеку websocket-client, введя следующую комманду, в коммандной строке.

pip install websocket-client

Далее, cкопируйте себе данный скрипт:

import websocket

header = {
    'user-agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:82.0) Gecko/20100101 Firefox/82.0'
}
def on_message(ws, message):
    try:
        print("Got msg: ", message)
        pass
    except:
        print('error occured - ignorring')

def on_error(ws, error):
    print("received error as {}".format(error))

def on_close(ws):
    print("Connection closed")

def on_open(ws):
    
    print("Open connection")
    ws.send('{"event":"load_stock","args":[{"type":"function","id":"qbotk"}]}')

def start():
    websocket.enableTrace(True)
    ws = websocket.WebSocketApp("wss://quicksell.store/",
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close,
                              header=header)
    ws.on_open = on_open
    ws.run_forever()

start()

Разберем его.

import websocket

Импортируем нужную библиотеку. Опустимся в функцию start.

websocket.enableTrace(True)

Включаем отладку.

ws = websocket.WebSocketApp("wss://quicksell.store/",
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close,
                              header=header)

Здесь, я использую обьект websocket.WebSocketApp который принимает принимает обработчики события. Первым аргументом указал, к какому серверу нужно подключаться wss://quicksell.store.

Передал 3 callBack функции (функции которые вызываются другими функциями).

  • on_message — будет вызываться в момент получения сообщения.
  • on_error — вызывается, при получении ошибки.
  • on_close — запускается перед закрытием веб-сокета.

И передал заголовок (header) с user-agent, на всякий случай.

После чего, передал callBack функцию on_open. Которая, запускается после открытия веб-сокета.

ws.on_open = on_open

И, в конце, открыл веб сокет.

ws.run_forever()

Далее, в функции on_open, я отправил сообщение с помощью функции ws.send, взятое ранее во время отладки, сообщение замените на свое.

ws.send('{"event":"load_stock","args":[{"type":"function","id":"qbotk"}]}')

Запустите скрипт.

На выходе получили json данные.

Закрыть веб-сокет, можно коммандой ws.close()

Другой вариант написания кода.

Есть еще один способ написания кода. В нем используется обьект WebSocket вместо WebSocketApp. Чуть ниже, привел предыдущий код, адаптированный под обьект WebSocket.

ws = websocket.WebSocket()
ws.connect("wss://quicksell.store/")
ws.send('{"event":"load_stock","args":[{"type":"function","id":"qbotk"}]}')
while True:
  data = ws.recv()
  print(data)

Разберем его.

ws = websocket.WebSocket()

Создаем обьект WebSocket

ws.connect("wss://quicksell.store/")

Подключаемся к серверу

ws.send('{"event":"load_stock","args":[{"type":"function","id":"qbotk"}]}')

Отправляем сообщение серверу

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

В бесконечном цикле while, получаем данные по веб-сокету (ws.recv), и выводим их в консоль.

Итоговый результат.