60个Python爬虫JS逆向案例:从加密定位到算法复现
这次我们来看一套在爬虫圈流传很广的实战资料60个Python爬虫JS逆向案例解析。它不打算讲什么是 requests、什么是 BeautifulSoup而是直接把爬虫过程中最让人头疼的JS逆向、加密参数、签名算法拆开揉碎用大量实战题目带你从定位加密入口开始一直做到用Python复现最后把逆向结果落到可运行的抓取脚本里。这类案例合集最值得关注的是范围。从标题就能看出它覆盖了三块东西一是JS逆向的常规操作比如找加密函数、打断点、观察调用栈、扣代码、补环境二是企业级接口里最常见的加密算法比如MD5、SHA系列、AES、RSA、Base64变种、HMAC签名等三是把逆向结果转成Python代码的完整过程。很多新手卡住的地方不是不知道算法而是不知道在网页里怎么找到算法入口。这套案例解决的主要就是这个问题。先给结论这套资料适合已经会Python基础语法、能用requests写简单爬虫、但一遇到加密参数就不知道怎么下手的读者。硬件上没有门槛不需要显卡不需要高端服务器一台普通电脑就够了。操作系统Windows、macOS、Linux都行只要你装好Python和Node.js。本文会围绕这套资料给出完整的使用方法、学习路线、调试思路、工程化落地方式以及最常见的报错排查清单帮助你判断值不值得花时间学以及怎么学效率最高。1. 核心能力速览先按一张表把这套资料的特点说清楚。能力项说明资料类型爬虫JS逆向实战案例合集包含60个案例核心主题Python爬虫、JS逆向、逆向加密、标准算法主要功能讲解定位加密参数、还原签名算法、用Python复现加密逻辑覆盖算法常见哈希算法、对称加密、非对称加密、编码算法、签名机制前置要求Python基础语法、requests基本使用、浏览器开发者工具基本操作硬件要求普通电脑即可无特殊硬件要求学习方式案例驱动建议边看边调试工程落地案例结果可封装成Python函数用于批量请求任务适合读者想突破爬虫加密瓶颈的初中级Python工程师、安全测试学习者合规边界仅限授权测试环境、公开接口学习和个人技术研究禁止未授权抓取需要说明一点60个案例并不是让你“背下来”而是让你通过大量重复形成一套固定的逆向分析习惯。算法本身是公开标准真正值钱的是定位逻辑和调试方法。2. 适用人群、学习边界与合规提醒2.1 这套资料适合谁如果你属于下面任何一类这套案例合集会很有帮助会写Python脚本但遇到接口里的sign、token、encrypt这类参数就不知道怎么处理。想理解企业级Web前端常见的加密体系但不想去啃晦涩的密码学教材。已经能抓包但不清楚怎么从JS文件里找到加密入口。希望把爬虫请求写得像真实客户端减少被服务端拒绝的概率。做安全测试或接口测试需要理解前端参数是怎么生成的。2.2 学习边界与红线这里必须强调合规问题。JS逆向本身是一项技术能力可以用于研究、漏洞挖掘、接口测试、开发辅助工具但绝不能用于未授权抓取他人数据、绕过付费机制、恶意攻击或窃取个人信息。国内《个人信息保护法》《数据安全法》《网络安全法》对数据抓取和利用有明确要求。使用这套案例时应当遵守下面的安全边界只能在获得授权的测试环境、自己的服务器、开源项目或公开API上进行学习。不要用里面的方法去抓取需要登录才能访问的私有数据。抓取前检查目标网站的robots协议和服务条款。不要针对具体网站做逆向绕过或分享绕过方案。涉及用户信息、版权内容时必须获得授权。简单说算法可以学工程落地要克制测试目标要合法。技术本身是中性的使用方式决定了它是工具还是风险。3. 学习环境与工具链准备学习这套案例前先把环境准备好。下面是一套通用配置清单适用于Windows、macOS和Linux三平台。3.1 基础环境工具用途说明Python 3.9运行爬虫脚本、复现算法建议3.10或3.11兼容性更稳Node.js 18调试JS代码、快速验证函数部分加密函数用Node执行更直接Chrome / Edge抓包、打断点、观察调用栈开发者工具是主战场代码编辑器管理案例代码VS Code是常见选择抓包工具分析请求、拦截响应Charles、Fiddler、Burp Suite等3.2 Python环境安装Windows下建议直接到Python官网下载安装包安装时勾选“Add Python to PATH”。如果你已有Python环境只需要确认版本python --version pip --version需要安装的核心库一般包括requests、pycryptodome、execjs等pip install requests pycryptodome execjs这里说明一下pycryptodome用来在Python里实现AES、DES、RSA等标准算法execjs可以在Python中调用本机Node.js执行JS代码适合处理无法快速用Python重写的混淆函数。3.3 Node.js安装很多案例在扣出JS函数之后不会马上手工转成Python而是先用Node跑一遍确认逻辑。安装Node后验证node --version npm --version3.4 浏览器开发者工具准备打开Chrome或Edge按F12进入开发者工具重点熟悉四个面板Network查看请求URL、请求头、请求体、响应体。Sources查看JS文件、打断点、跟踪调用栈。Console手动执行JS片段快速验证函数输出。Application查看Cookie、LocalStorage、SessionStorage。这套工具链整体上没有难装的软件装完就能进入案例实操。这也是这类资料一个很明显的优势软门槛低硬门槛主要在分析思维。4. 六类高频JS逆向场景拆解60个案例虽然数量多但底层场景是有规律的。根据这类资料的常见结构可以归纳为六类每一类背后对应一套固定的解决方案。4.1 参数加密类这是最普遍的一类。接口里多了一个sign、s、v之类的参数每次请求都不一样。处理思路是在开发者工具Network面板找到发起请求的XHR。找到请求参数里加密字段的名字。在Sources面板中全局搜索这个字段名。定位到生成该字段的JS函数。在函数入口打断点观察入参和返回值。把函数逻辑用Python或Node实现。这类案例的核心是让人学会“通过参数名反向定位函数”而不是一上来就猜算法。4.2 标准算法识别类企业级加密最常见的不是高深算法而是标准算法的组合编码类Base64、Hex。摘要类MD5、SHA1、SHA256、HMAC-MD5、HMAC-SHA256。对称加密AES-CBC、AES-ECB、DES。非对称加密RSA。识别方法可以放在搜索加密参数后的代码里看比如看到createHash、createHmac、CryptoJS.AES、JSEncrypt这些关键字基本就能判断算法类型。标准算法有一个好处可以直接用pycryptodome或者Python内置hashlib复现不用扣整个JS文件。4.3 请求头与Cookie校验类有些接口的加密不在请求体里而在请求头或Cookie中。常见的有User-Agent带指纹信息。Authorization是动态token。Cookie中某个字段由JS生成服务端校验。这部分案例训练的是“完整还原请求链路”的能力不能只看一个请求要看页面触发请求前执行了哪些JS。4.4 浏览器环境检测类有些JS会检测当前运行环境是不是真实浏览器比如检查window.navigator.webdriver、window.chrome、document.hidden等属性。这类在Python爬虫里很常见处理方式分成两种一是把环境检测部分的JS逻辑用Python模拟返回二是用Node配合jsdom等库补环境。4.5 反爬与请求频率限制类这类案例实际上不是纯JS逆向而是讲爬虫请求怎么被服务端限制、怎么在合规范围内合理低频访问。比如接口返回验证码、滑块、429状态码时的应对思路。这里必须提醒这部分内容只能用于理解反爬机制在授权环境下做研究不能用来自动化绕过验证码或规避服务端限制。4.6 扣代码与补环境类当加密逻辑复杂没法简单用Python重写时常见做法是把JS文件里的关键函数抠出来放到一个独立的JS脚本里然后用Node运行。如果运行时报错提示缺少浏览器对象就要补简易环境。execjs就是在这种场景下常用的桥梁。5. 通用JS逆向分析流程与代码示例不管你面对的是哪一类场景下面这套流程可以覆盖大部分情况。建议把这套流程作为“肌肉记忆”反复练习60个案例本质上就是在强化这套流程。5.1 定位请求与加密参数第一步打开浏览器开发者工具的Network面板勾选Fetch/XHR刷新页面找到目标接口。观察请求URL和请求体找到加密字段。5.2 全局搜索加密字段名切到Sources面板按CtrlShiftF打开全局搜索输入加密字段名比如sign。搜索结果会有很多优先看名字里带create、getSign、makeSign、encrypt的JS函数。5.3 打断点并观察入参在候选函数的return语句处打断点重新触发请求。此时浏览器会停在断点位置可以在Scope面板看到函数的入参和局部变量。这一步是核心目的是搞清楚加密函数的输入是什么。5.4 手动执行JS验证在Console里手动调用这个函数传入同样的参数看输出是否和Network里抓到的参数一致。如果一致说明函数定位正确。下面给出一个教学示例。假设页面里有一段核心加密逻辑的JS简化为const crypto require(crypto); function buildSign(params, secret) { // 按key排序后拼接 const signStr Object.keys(params) .sort() .map(key ${key}${params[key]}) .join(); // HMAC-SHA256签名 return crypto.createHmac(sha256, secret) .update(signStr) .digest(hex); } module.exports { buildSign };这是一个标准算法封装它真实业务里经常出现。用Python同步实现import hashlib import hmac from typing import Dict def build_sign(params: Dict[str, str], secret: str) - str: sign_str .join( f{key}{params[key]} for key in sorted(params) ) return hmac.new( secret.encode(utf-8), sign_str.encode(utf-8), hashlib.sha256, ).hexdigest()两段代码的输入输出完全一致。这就是“JS逆向转Python”的本质把页面里看到的算法逻辑用Python再实现一遍不是抄代码而是理解参数拼接规则和算法类型。5.5 用Python调用JS兜底有些场景下JS代码被压缩混淆手工还原成本太高。此时可以用Node子进程或者execjs调用JS文件直接拿结果。下面是Node子进程方式import json import subprocess def build_sign_by_node(payload: dict) - str: proc subprocess.run( [node, sign.js, json.dumps(payload)], capture_outputTrue, textTrue, timeout10, ) if proc.returncode ! 0: raise RuntimeError(fnode执行失败: {proc.stderr}) return proc.stdout.strip()这里的sign.js是已经扣出来的独立JS文件。这个模式的优点是见效快缺点是依赖Node环境部署到服务器时也需要安装Node。所以更稳妥的做法是先用Node确认逻辑再用Python重写最终去掉对Node的依赖。6. 从JS逆向到Python批量任务落地单个接口逆向完成后要考虑工程化问题。60个案例如果只停留在“能跑通”实际价值有限把它变成稳定的Python任务模块才是真正的落地。6.1 模块目录结构建议按下面的结构组织代码crawler_workspace/ ├── algorithms/ # 标准算法复现如aes_cbc.py、rsa_encrypt.py ├── decrypt/ # 从JS抠出的降级方案如node_bridge.py ├── clients/ # 各类请求客户端封装session、header、sign ├── tasks/ # 批量任务脚本 ├── data/ # 抓取结果数据 ├── logs/ # 运行日志 └── tests/ # 算法一致性验证这样的好处是算法实现、请求逻辑、批量任务分层管理后续切换业务目标时只需要改clients和tasks。6.2 登录态与请求头管理逆向成功之后请求能不能稳定跑起来还取决于header和Cookie。用requests.Session管理连接统一设置UA、Referer把动态参数通过预处理函数注入。import requests session requests.Session() session.headers.update({ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Referer: https://example.com/, }) def inject_dynamic_params(url: str, payload: dict) - dict: 把JS逆向得到的签名逻辑注入到请求参数中。 实际实现需要按目标接口的签名规则替换。 payload dict(payload) # 这里调用上面实现的build_sign按业务定制入参 # payload[sign] build_sign(payload, secret) return payload def fetch_once(url: str, base_payload: dict) - dict: payload inject_dynamic_params(url, base_payload) resp session.get(url, paramspayload, timeout10) resp.raise_for_status() return resp.json()这里没有写到具体签名函数原因是要提醒你生产环境里每个接口的签名规则都不同先把5.4里的算法测试跑通再把函数接进来。6.3 批量任务与失败重试批量爬取不是“写个for循环跑所有URL”这么简单。要控制请求频率、记录状态、失败重试、去重。下面是一个通用模板import logging import time from typing import Callable, Iterable logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) def run_batch( requests_iter: Iterable[dict], fetch_func: Callable, interval: float 1.0, max_retry: int 3, ): for i, req in enumerate(requests_iter, start1): for attempt in range(1, max_retry 1): try: data fetch_func(**req) # 这里插入结果存储逻辑 logging.info(f第{i}个请求成功) break except Exception as exc: logging.warning(f第{i}个请求第{attempt}次失败: {exc}) if attempt max_retry: logging.error(f第{i}个请求重试耗尽跳过) else: time.sleep(interval * attempt) time.sleep(interval)使用这个模板有几个必须注意的点请求间隔不能太短避免给目标服务器造成压力每次失败要记录日志重试次数要有限制对已经抓取过的数据要做去重。6.4 数据存储与结构化60个案例里最后通常会落到数据保存。单机场景建议先用SQLite或CSV数据量大再考虑MySQL或对象存储。关键是设计好主键和去重字段避免重复数据堆积。一个简单的CSV追加例子import csv from pathlib import Path OUTPUT Path(data/result.csv) def append_result(row: dict): is_new not OUTPUT.exists() with open(OUTPUT, a, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnameslist(row.keys())) if is_new: writer.writeheader() writer.writerow(row)这里只做示例。真实业务里建议先落本地文件再定期导入数据库防止批量任务中断导致数据丢失。7. 算法一致性与性能验证做完逆向和工程化不能直接上线先做一致性验证。7.1 验证JS输出和Python输出是否一致运行一套脚本对同一组输入分别调用JS函数和Python函数比对结果import json import subprocess def js_sign_for_test(payload: dict, js_path: str) - str: proc subprocess.run( [node, js_path, json.dumps(payload)], capture_outputTrue, textTrue, timeout10, ) return proc.stdout.strip() def test_sign_consistency(): test_cases [ {name: test, ts: 1710000000}, {uid: 10086, ts: 1710000001, page: 1}, {keyword: python, limit: 10}, ] for case in test_cases: js_result js_sign_for_test(case, sign.js) py_result build_sign(case, secret_key) assert js_result py_result, fcase {case} 不一致 print(fcase {case} - {py_result})这一步非常关键。很多案例跑不通原因不是算法没找对而是某个字段的编码方式或大小写规则不一致比对之后就清楚了。7.2 观察响应速度与请求成功率在小批量任务里统计平均响应时间、状态码分布、失败率。如果失败率高先看是否频率过快触发限流。单机爬虫的性能瓶颈往往不在CPU而在目标服务器的响应速度和网络延迟。请求间隔建议从1秒起步根据目标接口的实际情况调整。不要为了追求速度去压缩间隔尤其不要对生产环境的接口做高频请求。7.3 资源占用观察这类案例不需要显卡运行时的资源占用主要集中在浏览器开发者工具占内存约500MB到1GB。Node.js调试进程内存占用不高但频繁调用会有进程创建开销。Python批量任务requests请求是IO密集型CPU占用很低使用进程池收益有限。如果使用execjs或者Node子进程要警惕每次调用都重新启动Node带来的延迟批量场景下优先改成Python原生实现。8. 常见问题与排查方法下面把学习这套案例时最容易碰到的问题整理成表。问题现象可能原因排查方式解决方案Python执行报错ModuleNotFoundError依赖库未安装pip list确认包pip install 对应依赖JS函数在浏览器里正常Node里报错代码依赖浏览器对象看报错中的变量名用jsdom补环境或改写函数算法复现结果和页面不一致参数拼接顺序或编码方式不同打印中间值逐段对比用单元测试锁定差异请求返回403请求头或Cookie校验失败对比浏览器请求头用Session保存Cookie并补全headers请求返回429请求频率过高查看响应头Retry-After增大间隔加重试机制execjs执行JS超时JS代码中存在死循环或依赖浏览器API用Node命令行单独执行拆分函数单独验证批量任务中途崩溃未处理网络异常或数据存储异常查看日志文件增加重试、事务、断点续跑同一个函数多次调用返回不同结果函数内部依赖时间戳或随机数对比入参中的动态字段把动态字段也纳入参数拼接找不到加密入口搜索字段名不准看请求体字段是否有加前缀改用网络面板的Initiator查看调用栈签名算法识别错误误把Base64当AES查看JS中关键词关注createCipher、decrypt等API8.1 定位不到加密函数的排查思路有时候搜索参数名搜不到结果这是因为前端代码做了压缩或者把字段名改了。这种情况下不要继续盲搜换两个方向使用Network面板里该请求的Initiator直接查看调用它的JS函数。搜索加密字段的常见函数名比如sign、encrypt、token、getParam。8.2 算法结果对不上的排查思路如果确认算法类型一致但Python结果和页面结果不同按顺序检查参数拼接顺序是否一致。是否用了JSON.stringify而不是普通字符串拼接。Base64编码时是否包含URL-safe处理。密钥是否需要解码比如Base64解码后再传给AES。AES的IV是否固定是否取自定义字符串。时间戳是否在运行时生成导致每次签名不同。9. 学习方法与最佳实践60个案例如果只是“看一遍”效果很差。技术类内容必须上手调试。下面给出一套适合大多数人的学习路径。9.1 第一种学法按算法类型刷先快速扫一遍案例目录把涉及MD5、SHA、HMAC的案例放到前面再刷AES、DES对称加密案例最后刷RSA非对称加密案例。这样每刷一个类型都是在强化同一种标准化实现方式。9.2 第二种学法按调试难度刷先做“直接搜参数名就能找到函数”的简单案例再挑战压缩混淆案例。通过难度递进逐步建立对JS调试工具的信任感。9.3 建立自己的训练库每个案例跑通后把以下信息记录在一个Markdown文件里目标接口的请求方式。加密参数名。定位方式搜索、Initiator还是Hook。算法类型。参数拼接规则。Python实现代码。踩过的坑。这样做30个案例后你会形成一套自己的逆向笔记比单纯收藏别人的整理更有价值。9.4 工程化最佳实践第一个案例先小参数测试不要在完整业务上直接跑。保留一套最小可运行配置便于快速回滚。加密实现、请求逻辑、批量任务分文件管理。批量任务必须有日志、重试、去重和断点续跑能力。接口服务或本地脚本要限制访问范围不要暴露到公网。涉及人脸、声音、版权素材、个人信息时必须确认授权。发布或商用前做效果复核确认数据来源合法合规。10. 总结这套60个Python爬虫JS逆向案例解析最核心的价值不是“60个能直接抄的答案”而是通过大量重复让你形成一套稳定的逆向分析流程定位加密参数、搜索函数入口、打断点观察入参、验证算法类型、用Python或Node复现、批量工程化落地。真正吃透这套流程后你面对接口加密问题时不会再靠猜而是能一步步拆解出请求参数的生成逻辑。如果你已经会Python基础语法和requests爬虫建议从最简单的案例开始先把浏览器开发者工具的断点调试练熟再进入算法复现阶段。最容易踩的坑是拿到一个案例后不调试就复制代码结果遇到稍微变化的目标接口就完全不会处理。正确的做法是把案例里的调试路径走一遍理解每一步为什么这样做再尝试用自己的方式实现一遍。第一次刷建议按算法类型分类而不是按案例编号从小到大这样能更快建立起标准算法与Python代码之间的对应关系。跑通三五个案例之后你就可以开始搭建自己的签名实现工具库把常见算法封装成独立函数。后续再遇到新的目标接口大部分工作都会变成“套模板 微调参数”。这套资料的整体难度曲线适中从新手到进阶都有覆盖。坚持把前20个案例完整调试完跨过最开始的“找不到入口”阶段后后面会越来越顺。建议收藏备用也建议给自己定一个目标每周精做三个案例并且每个案例都写成调试笔记。