爬虫逆向的基本思路

一、爬取的基本流程

1. 确认想爬取的具体内容

  • 明确你要爬取的数据的具体类型,通常是某些网页的文本内容、图片、JSON 数据等。要事先确认爬取的目标网页或 API 接口,以及你希望获取的具体信息,例如岗位名称、公司信息、薪资等。

2. 进行抓包处理

  • 使用抓包工具(如 Fiddler、Wireshark、Burp Suite)来拦截页面加载的网络请求。
  • 如果网页内容较多,且页面的请求数较多,可以使用浏览器的开发者工具(F12)中的“Network”面板,或选择 XHR(XMLHttpRequest)和 Document 请求。XHR 请求通常是数据接口请求,Document 请求则是加载页面的 HTML。

3. 明确能获取数据的接口

  • 确定接口和 API 的位置。通常,API 接口会返回 JSON 格式的数据,而 HTML 页面则返回完整的网页内容。
  • 查看接口请求的 URL 地址、请求方法(GET 或 POST)及相关的请求头(如 User-AgentAuthorization 等)和请求参数(如 signtimestamp 等)。

4. 将其转化为 request 请求

  • 根据抓取到的接口信息,将其转换为爬虫请求,通常是使用 Python 的 requests 库、Scrapy 或者 Node.js 的 axios 来模拟请求。
  • 确保模拟请求时传递正确的请求头、请求参数以及 cookies。

5. 找到逆向目标

  • 逆向目标通常是需要解密或计算的参数,例如请求中的签名(sign)、时间戳(timestamp)或随机字符串等。

6. 打开 F12 开发者工具

  • 在浏览器中按 F12 打开开发者工具,切换到 Network 面板,观察发送的网络请求,寻找接口的 URL 和相关请求头、请求体。

7. 打断点

  • 使用浏览器的调试工具,设置断点来暂停代码执行。可以选择 XHR 断点,或者通过栈跟踪和关键字搜索定位代码中的加密或签名函数。
  • 通过 debugger 语句或直接在开发者工具的 Sources 面板设置断点,在请求发起之前找到请求头的构造过程。

8. 寻找参数生成过程

  • 通过设置断点,跟踪请求发送前的参数构造过程,查看参数(如 sign)的生成逻辑。
  • 确认是否使用了加密算法(如 MD5、SHA1、RSA、AES 等)来加密参数。

9. 找到加密函数

  • 找到用于加密的 JavaScript 函数,通常加密函数会涉及到字符串拼接、哈希计算、加密算法等操作。
  • 将相关 JavaScript 代码保存下来,测试其是否可以在本地运行并返回正确的结果。

10. 扣出 JS 代码在本地运行

  • 扣取 JavaScript 代码并在本地环境中运行。此时需要注意模拟浏览器环境,如果代码依赖于浏览器的全局对象(如 windowdocumentnavigator),需要使用 Node.js 的 puppeteerplaywright 来模拟浏览器环境。

11. 更换随机 IP 和 UA 等参数

  • 为了避免被反爬虫机制检测到,需要通过更换请求的 IP 地址、用户代理(UA)、Referer 和其他参数来绕过浏览器指纹识别。
  • 可以使用代理池、Tor 网络或 VPN 来更换 IP 地址;使用随机生成的 UA 字符串来避免固定 UA 检测。

12. 逆向完成

  • 如果上述步骤都顺利完成,就意味着逆向成功,能够模拟并发送请求,获取目标数据。

二、一般的加密方式

1. 对于参数加密

  • 加密参数: 通常是 signtimestampnonce 等参数,这些参数通常会进行加密或签名后发送到服务器。
  • 时间戳和随机数: 部分加密机制会在请求参数中加入时间戳或随机数(如 timestampnonce 等),这些参数通常是为了防止请求重放攻击。
  • 请求方式:
    1. 请求参数发生变化无法请求: 只要加密参数不变,服务器会返回数据。可以通过抓包和调试分析这些变化。
    2. 无法访问: 请求参数中包含时间戳或日期范围限制,需要获取新的时间戳或调整请求时间来绕过。

定位方法: 使用浏览器开发者工具(F12),结合搜索、XHR 断点、栈跟踪、控制台调试等方法定位加密函数。

  • Cookie 加密示例: 比如在 Boss 直聘 中,zptoken 请求成功后返回两个 Cookie,计算方式需要将两个数据进行加密和计算形成新的的 zptoken
  • Hook 到 Cookie 的位置: 通过浏览器的调试工具或 JavaScript 注入脚本来 hook 获取和计算这些 Cookie 的地方。

3. 对于请求整体加密和返回体加密

  • 加密算法: 常见的加密算法有 AES、RSA 等。服务器对请求进行加密后返回加密的数据,需要逆向分析出加密算法、密钥以及加密方式。
  • 常见问题: 如果加密方式较为复杂,可能需要对 JavaScript 加密代码进行脱壳,解密或绕过。

三、逆向中可能出现的问题

1. 无法找到请求接口

  • 解决思路:仔细查看所有请求,检查页面加载时的每个请求,排除不相关的请求,最终确认能提供数据的接口。

2. 无法打开 F12 或进入网站退出

  • 解决思路:一些网站会通过 JS 判断开发者工具的打开,防止用户进行逆向分析。可以使用 JS 文件替换、修改源代码,或通过抓包工具直接获取网络请求。

3. 调试过程中电脑变卡,调试困难

  • 解决思路:这种情况可能是因为 JS 代码过于复杂,或者浏览器调试工具占用过多资源。可以尝试对 JS 代码进行 override 或使用抓包工具进行替换。

4. 难以找到关键函数

  • 解决思路:可以进行全局搜索,寻找与加密相关的关键字(如 modeivencdecsign 等)来缩小范围,快速定位到加密算法的实现代码。

5. 时间过长导致跳转其他函数

  • 解决思路:如果时间过长,浏览器可能会自动跳转到其他函数。需要使用控制台调试,控制断点触发的时间,或者在浏览器中通过强制暂停代码执行来查看函数。

6. JS 代码无法直接运行或加密出错

  • 解决思路:可以手动补全缺失的环境变量(如浏览器全局对象),或使用 Node.js 相关工具来模拟浏览器环境(例如 puppeteer)。此外,也可以根据源代码的位置定位检测函数,绕过检查。

7. 遇到混淆代码

  • 混淆代码的主要目的是使代码逻辑不易被理解。例如,通过数组、whileforcaseif 等语句的组合,使代码看起来更加复杂。
    解决方法:
  • AST(抽象语法树): 使用 AST 工具(如 babel)分析混淆的代码,帮助理解其真实逻辑。
  • 代码反混淆工具: 可以使用如 deobfuscator 等工具反混淆代码,将混淆后的代码还原成可读性更强的格式。
posted @   牛奶糖牛奶  阅读(126)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示