RPC通用爬虫
一、项目案例
- 测试网址: aHR0cDovL3d3dy5mYW5nZGkuY29tLmNuL3NlcnZpY2UvYnVsbGV0aW5fbGlzdC5odG1sP3R5cGVhPWI2N2MzYjhhZGJkY2U3NGQ=
二、Rpc原理解析
图解关系:
主要包括,爬虫程序、Web服务器、WebScoket服务器、浏览器
核心流程:
爬虫程序调用服务器,可传入参数给服务器,服务器接收到参数后创建一个WS连接,连接到WebSocket服务器;WebSocket服务器其实什么都没有做,就是将消息传递浏览器。因为我们提前替换一些代码,相当于进行hook(找到参数加密解密逻辑,然后利用window定义全局变量),后续传递消息给浏览器,让它帮助我们完成加密解密的工作。将加密参数或是解密参数结果直接返回,发送给WebSocket服务器,最后经过Web服务器返回给我们的爬虫,继续请求服务器获取数据。
启动顺序:
1.WebSocket服务器;
2.断点浏览器,注入JS代码 建立与WS的连接;
3.Web服务器开启等待请求,建立WS连接;
4.Spider调用服务器接口;
三、Rpc代码分享
-
WebSocket服务器
''' 模块依赖 pip install websockets pip install sanic ''' import re import asyncio import websockets # TODO: 消息转发 握手原则 BROWSER_KEYWORD = "regist" PYTHON_SERVER_KEYWORD = "sanic2" # ws链接内存存储 browser_info: dict = { } sanic_info: dict = { } async def dispatch_action(ws, path): """ 请求分发,存储不同的连接 :param ws: 服务器与连接对象的连接 :param path: 请求路径 :return: """ # action_name 标识 连接对象身份 ... re_result = re.compile("/(?P<action_name>.*?)\?name=(?P<proj_name>.*)").search(path) action_name: str = re_result.group("action_name") proj_name: str = re_result.group("proj_name") # 连接保存 对应存储连接对象 {} if action_name == PYTHON_SERVER_KEYWORD: # Python sanic_info[action_name]