如何无需改写为异步将Python多线程爬虫转为WebSocket服务器?
无需改写异步的WebSocket服务器改造方案
当然有办法,你可以使用websocket-server这个轻量级库,它基于线程实现WebSocket服务,完全不需要将你的多线程爬虫改写成异步代码。下面是具体的改造步骤和完整代码:
1. 安装依赖
执行以下命令安装库:
pip install websocket-server
2. 改造后的完整代码
from threading import Thread import time import requests from websocket_server import WebsocketServer # 全局WebSocket服务器实例 ws_server = None # WebSocket事件处理函数 def new_client(client, server): print(f"新客户端连接: {client['address']}") def client_left(client, server): print(f"客户端断开连接: {client['address']}") def send_ws_message(data): """向所有连接的WebSocket客户端推送消息""" if ws_server: ws_server.send_message_to_all(data) class Scraper: def __init__(self, url): self.url = url def _send_request(self): try: response = requests.get(self.url) if response.status_code == 200 and 'good' in response.json(): # 推送新数据,这里假设推送响应的JSON内容 send_ws_message(str(response.json())) print("发现新数据,已推送") except Exception as e: print(f"请求出错: {e}") def scrape(self): while True: Thread(target=self._send_request).start() time.sleep(1) if __name__ == "__main__": # 初始化WebSocket服务器,绑定本地8080端口 ws_server = WebsocketServer(host='0.0.0.0', port=8080) ws_server.set_fn_new_client(new_client) ws_server.set_fn_client_left(client_left) # 启动WebSocket服务器在独立线程 Thread(target=ws_server.run_forever, daemon=True).start() print("WebSocket服务器已启动,监听8080端口") # 启动爬虫 target_url = "https://example.com/your-api-endpoint" # 替换为你的目标URL scraper = Scraper(target_url) scraper.scrape()
关键说明
- WebSocket服务器运行在独立的守护线程中,和你的多线程爬虫并行执行,完全不影响原有爬虫的逻辑。
send_ws_message函数可以直接在爬虫的线程中调用,向所有连接的客户端推送新数据。- 你可以根据需求自定义WebSocket的事件处理逻辑(比如客户端连接/断开的通知),也可以实现向特定客户端推送消息的功能。
另外,如果你需要更复杂的Web功能,也可以考虑Flask-SocketIO,它同样支持在多线程环境下运行,不过websocket-server更轻量,更适配你的现有场景。
内容的提问来源于stack exchange,提问作者MachineLearner
相关产品推荐
相关产品推荐

