#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__))