Передача данных из Scrapy в сокет

#python #sockets #websocket #scrapy

#питон #сокеты #веб- сокет #шершавый

Вопрос:

В настоящее время у меня есть scrapy, который используется для сканирования данных с веб-сайтов. Я хочу отправить текущие данные подключенному клиенту, которые он очистил с помощью сокета.

 clients = set()
clients_lock = threading.Lock()

host = socket.gethostbyname("") 
port = 10010

def listener(client, address, item):
    print ("Accepted connection from: ", address)
    with clients_lock:
        clients.add(client)
    try:    
        data = client.recv(1024)
        if data == ('0').encode():
            timestamp = datetime.datetime.now().strftime("%I:%M:%S %p")
            client.send(timestamp.encode())
    finally:
        with clients_lock:
            clients.remove(client)
            client.close()

def send_to_socket(item):
    s = socket.socket()
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind((host,port))
    s.listen(3)
    th = []

    client, address = s.accept()
    th.append(Thread(target=listener, args = (client,address, item)).start())
    s.close()
 

Приведенный ниже код — это код scrapy, который вызывает функцию, запускающую сокет, текущая проблема заключается в том, что я не могу извлекать данные из клиентского кода в режиме реального времени. Текущий код закрывает клиентское соединение каждый раз, когда оно отправляет данные. Есть ли какой-либо способ непрерывной отправки данных без закрытия клиентского соединения. Если я удалю client.remove(client), код застрянет и не будет запускать _build_link_item.

_build_link_item выполняется непрерывно для генерации данных с разных URL-адресов, и я хочу отправить эти данные, которые он сгенерировал, клиенту.

 def _build_link_item(response):
    """Builds a LinkItem object for the given response"""
    parser = HTMLParser(response)

    item = LinkItem(
        url=response.url,
        status=response.status,
        content_type=response.headers.get("Content-Type", b"").decode("utf-8") or "",
    )

    print(json.dumps(item.__dict__), flush=True)
    send_to_socket(json.dumps(item.__dict__))