RPC通用爬虫

news/2024/4/16 2:58:03

文章目录

  • RPC通用爬虫
    • 一、项目案例
    • 二、Rpc原理解析
    • 三、Rpc代码分享
    • 四、自我总结

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:  # Pythonsanic_info[action_name] = wselif action_name == BROWSER_KEYWORD: #  browserbrowser_info[action_name] = wsreturn action_nameasync def handler(ws, path):"""主要处理ws请求:param ws:服务器与连接对象的连接:param path: 请求路径:return:"""action_name = await dispatch_action(ws, path)print("有人来了: =>>>", action_name)# 收到数据,转发数据 可以基于Jsonasync for msg in ws: #msg 参数 或者是 返回值# 请求控制if action_name == PYTHON_SERVER_KEYWORD:# 发送给浏览器 连接对象await browser_info[BROWSER_KEYWORD].send(msg)# 返回加密结果elif action_name == BROWSER_KEYWORD:# 发送给服务器 连接对象await sanic_info[PYTHON_SERVER_KEYWORD].send(msg)async def main():async with websockets.serve(handler, "127.0.0.1", 8868) as rpcfucktheworld:print("webScoketServer start ...")await asyncio.Future()'''
    启动的顺序很重要
    1.websocketserver
    2.browser
    3.webserver
    4.spiderprocess:
    spider <=> webserver <=> websocketserver <=> browser 
    '''if __name__ == '__main__':asyncio.run(main())
  • Browser浏览器

        (function (){// 建立连接const socket = new WebSocket('ws://127.0.0.1:8868/regist?name=ooxx');// 接收到消息时的回调函数socket.addEventListener('message', function (event) {const obj = JSON.parse(event.data);// obj 所有的参数console.log("参数来了:", obj)// 植入js代码搞一波....window.FUCK1();const result = {// any you want to return value..."MmEwMD":window.FUCK2(obj.url),"cookie": document.cookie,}console.log("数据打包回家:", result)socket.send(JSON.stringify(result));});})()
  • WebServer服务器

    '''
    第三方模块下载:
    pip install websockets
    pip install sanic
    '''
    import json
    import websockets
    from sanic.request import Request
    from sanic.response import text
    from sanic import Sanicapp = Sanic(__name__)# http://localhost:8089/getSign?projName=ooxx# TODO:初步完成一部服务器的搭建 简易版本 支持传参 针对某一个项目@app.route("/getSign", methods=["GET", "POST"])
    async def get_sign(request: Request):proj_name = request.args.get('projName')if not proj_name:raise Exception("请输入项目名称!")proj_params: dict = request.jsonprint("来了:", proj_params, type(proj_params))async with websockets.connect("ws://127.0.0.1:8868/sanic2?name={}".format(proj_name)) as ws:await ws.send(json.dumps(proj_params))result = await ws.recv()return text(result)if __name__ == '__main__':app.run(host="127.0.0.1", port=8089, debug=True)  # spider view
  • Spider爬虫程序

    import json
    import requests
    import timeclass PinduoduoSpider():def __init__(self):self.page = 1self.url = "https://脱敏处理/spike_list"self.headers = {......}def get_anti_content(self):anti_content = requests.get("http://脱敏处理/getSign?projName=脱敏处理").json()["data"]return anti_contentdef task(self):response = requests.get(self.url, headers=self.headers, params={"page": self.page,"size": "50","anti_content": self.get_anti_content()})print(response.json())def run(self):while True:self.task()print("当前页码:" + "=" * 20 + '>>>', self.page)self.page += 1time.sleep(2)if __name__ == '__main__':脱敏处理().run()

四、自我总结

1、关于爬虫这件事:
通过对RPC框架进行学习,我发现如果我们越了解服务器架构,后端开发,运维开发,就越有认知和思想。
例如:Scrapy分布式 采用Redis作为消息队列,可以开启多个Scrapy爬虫程序对指定网站进行数据抓取。优点:支持断点续爬虫,可以持续不断的采集数据,worker处于阻塞状态,等待任务到来然后执行对应的爬虫逻辑,这为抓取成千上万的数据提供了结实的基础。利用Redis里面的集合,我们可以对数据进行去重,从而保证了数据的唯一性;利用Redis里面的列表,我们可以实现消息队列,对请求对象进行排序,更多精彩部分在下期分享。2.RPC运用场景:
当你找到了参数加密或解密位置,但是其逻辑非常复杂你就可以使用RPC搭建一套服务器框架,快速远程调用获取想要的参数。3.RPC优缺点:
RPC优点>: 不用逆向了,直接获取结果,直接拿到结果,逻辑非常简单依赖网络协议,各个程序之间的通信。
RPC缺点>: 采集速度太慢,性能不好,速度不够快,只能暂时解决问题,采集更多的数据有一定的困难;必须开启本地浏览器(or selenium模拟),浪费资源。
列,对请求对象进行排序,更多精彩部分在下期分享。2.RPC运用场景:
当你找到了参数加密或解密位置,但是其逻辑非常复杂你就可以使用RPC搭建一套服务器框架,快速远程调用获取想要的参数。3.RPC优缺点:
RPC优点>: 不用逆向了,直接获取结果,直接拿到结果,逻辑非常简单依赖网络协议,各个程序之间的通信。
RPC缺点>: 采集速度太慢,性能不好,速度不够快,只能暂时解决问题,采集更多的数据有一定的困难;必须开启本地浏览器(or selenium模拟),浪费资源。

http://www.ppmy.cn/news/300087.html

相关文章

公网对讲机修改对讲机程序_更少的对讲机,对讲机-更多专心,专心

公网对讲机修改对讲机程序 重点 (Top highlight) I often like to put a stick into the bike wheel of the UX industry as it’s strolling along feeling proud of itself. I believe — strongly — that as designers we should primarily be doers not talkers. 我经常喜…

浅谈350M警用集群对讲机的使用与维护

在公安日常执勤工作中&#xff0c;对讲机已经成为警力队伍进行重大勤务和开展日常工作的有效通信工具和主要调度平台。350M警用集群对讲机与常规对讲机相比&#xff0c;具有更加强大的通信调度能力&#xff0c;且功能更多、保密性更好&#xff0c;符合警务任务对无线通信的要求…

酒店行业如何选购对讲机?

公网对讲机对于酒店的管理起到非常大的作用&#xff0c;酒店业使用公网对讲机&#xff0c;可以在日常的工作中更好的协调安排各项事务&#xff0c;从而提高酒店的服务水平。那么这种行业的公网对讲机选购时应注意些什么呢? 酒店行业如何选购对讲机&#xff1f; 在无线通讯技…

无线对讲机服务器,网络对讲机服务器设置

网络对讲机服务器设置 内容精选 换一换 在使用裸金属服务器时&#xff0c;您可能会遇到各种问题&#xff0c;比如远程登录、扩容磁盘、重装操作系统、备份服务器等。为方便您获取这些场景的操作指导&#xff0c;本文提供了常用操作的导航。在您开始创建裸金属服务器之前&#x…

CSDN第57期编程竞赛活动经验

好难好难&#xff0c;逻辑应该是对的&#xff0c;但都超时了&#xff0c;通过控制数量&#xff0c;才勉强有测试用例通过 题目1、凑数 给定一组n个正整数&#xff0c;要求每次选其中一个数乘以或除以一个素数&#xff08;称为一次凑数&#xff09;&#xff0c;问至少需要凑数多…

LintCode - 89 K数之和

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 89 K数之和 - LintCode 题目描述 给定 n 个不同的正整数&#xff0c;整数 k (k≤n)以及一个目标数字 target。  在这 n 个数里面找出 k 个数&#xff0c;使得这 k 个数的和等于目标数字&#xff0c;求问…

使用卷积神经网络构建一个图像分类模型

在本文中&#xff0c;我们将详细介绍如何使用卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;构建一个图像分类模型。我们将从理论基础开始&#xff0c;然后通过编写代码来实现一个完整的模型&#xff0c;并在一个实际的数据集上进行训练和…

Atcoder Beginner Contest 295

A - Probably English AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N110; string s[N]; int main() {int n;cin>>n;for(int i1;i<n;i) cin>>s[i];bool flagfalse;for(in…

惠普打印机和扫描仪修复医生 HP Print and Scan Doctor

https://support.hp.com/cn-zh/topic/printscandoctor-printing-problems http://ftp.hp.com/pub/printers/hppsdr/patches/HPPSdr.exe rcy的电脑连的是无线 。 打印机ip 192.168.1.123 转载于:https://www.cnblogs.com/simadi/p/10966937.html

【统信UOS】扫描仪设备管理驱动安装

1、 先安装对应扫描设备驱动 驱动可以在官方下载 https://www.chinauos.com/ecology/adapt 注&#xff1a;关闭开发者模式的需要注意软件签名问题 2、下载专用扫描仪工具 由于UOS自带的扫描工具功能有限且不好用&#xff0c;部分设备无法添加管理&#xff0c;下载gscan2pdf…

DPDK多进程

DPDK初始化参数列表 rte_eal_init参数列表获取方式&#xff1a; 运行testpmd --help阅读dpdk源码 如下是testpmd打印的常用参数&#xff1a; EAL common options:-c COREMASK Hexadecimal bitmask of cores to run on-l CORELIST List of cores to run onT…

通用连接扫描仪文档

通用连接扫描仪文档 不同厂家扫描仪基本都支持twain接口&#xff0c;所以只需要调取twain接口中的方法即可实现控制各个扫描仪。 首先&#xff0c;用c来调用twain接口实现扫描功能并写好方法供外部调用&#xff0c;然后把该c程序编译成dll文件&#xff0c;最后用java程序通过…

SICK激光扫描仪LMS511连接通讯

一、设备介绍&#xff1a; 型号&#xff1a;LMS511-10100&#xff08;DC 24v&#xff09; 品牌&#xff1a;SICK 操作环境&#xff1a;Windows 10 64bit 软件&#xff1a;SOPAS ET 连接线&#xff1a;串口转网口线&#xff08;1根/4针 子头&#xff09;&#xff0c;电源线…

科技新品 | FOSSIL太阳能系列限量腕表;富士通40ppm高速扫描仪;Apple AirTag安全支架...

“科技新产品动态”栏目把新鲜的具有代表性的科学产品带到您眼前&#xff0c;涉及消费电子&#xff0c;半导体、服务器、智能家电等众多品类&#xff0c;提供图片和简单的文字介绍。 FOSSIL推出第二代SOLAR太阳能系列限量版腕表&#xff1b;富士通推出两款ScanSnap系列高速扫描…

富士通扫描仪PaperStream系列软件喜迎新成员;B2B音乐授权市场Songtradr完成D轮融资并获超额认购| 全球TMT...

国内市场 泛亚数据中心公司Big Data Exchange&#xff08;BDx&#xff09;位于中国南京的数据中心园区启动&#xff0c;目前一期机房&#xff08;NKG1&#xff09;已正式投入运营。NKG1是该市第一个获得Uptime Institute设计文件三级认证的数据中心&#xff0c;可提供4MW的IT电…

最新微信835协议

微信iPad协议&#xff0c;采用最新的ASE加密&#xff0c;以及最新的rqtx算法&#xff0c;06算法&#xff0c;iPad协议是一套微信个人号接口&#xff0c;基于web开发&#xff0c;杜绝封号&#xff0c;追封&#xff0c;模拟器封号&#xff0c;环境异常封号&#xff0c;批量封等封…

Codeforces Round #835 (Div. 4) B. Atilla‘s Favorite Problem

Codeforces Round #835 (Div. 4) B. Atilla’s Favorite Problem To solve the problem we need to find the character with the highest alphabetical order in our string, since Atilla will need at least that alphabet size and won’t need more. To do this iterate …

Round#835(Div.4)E. Binary Inversions

题目链接&#xff1a;Problem - E - Codeforces 题目概述&#xff1a;给一个只含零一的数组。我们可以选择数组内的任意元素&#xff0c;至多执行下列操作一次。&#xff08;只能选择一个元素执行操作&#xff09;。操作为&#xff1a;反转你选择的元素&#xff08;1变为0&…

Codeforces Round #835 (Div. 4)A.B.C.D.E.F

A. Medium Number 题目链接&#xff1a; Problem - A - Codeforces 题面&#xff1a; 题意&#xff1a; 给定三个数&#xff0c;求中间那个数的值 思路&#xff1a; 我们可以分别求出三个数的总和&#xff0c;最大值和最小值&#xff0c;在通过总和减最大值和最小值的方…

Codeforces Round #835 (Div. 4)题解

补完一套div4&#xff0c;此图为证 提交记录 说明 题目链接 一共7个题&#xff0c;做出前5题&#xff0c;排到接近四千名了。前5题就是模拟或者像前缀和后缀和之类的简单题&#xff0c;没什么好说的。比较难想的是F&#xff0c;好想但是细节多难调的是压轴题G。 A题 Medium N…
最新文章