反爬虫的四种常见方式-JS逆向方法论

2023-11-10

现在的网页代码搞得越来越复杂,除了使用vue等前端框架让开发变得容易外,主要就是为了防爬虫,所以写爬虫下的功夫就越来越多。攻和防在互相厮杀中结下孽缘却又相互提升着彼此。

本文就JS反爬虫的策略展开讨论,看看这中间都有着怎样的方法。

一 、JS写cookie

我们要写爬虫抓某个网页里面的数据,无非是打开网页,看看源代码,如果html里面有我们要的数据,那就简单了。用requests请求网址得到网页源代码然后解析提取。

等等!requests得到的网页是一对JS,跟浏览器打开看到的网页源码完全不一样!这种情况,往往是浏览器运行这段JS生成一个(或多个)cookie再带着这个cookie做二次请求。服务器那边收到这个cookie就认为你的访问是通过浏览器过来的合法访问。

其实,你在浏览器(chrome、Firefox都可以)里可以看到这一过程。首先把Chrome浏览器保存的该网站的cookie删除,按F12到Network窗口,把“preserve log”选中(Firefox是“Persist logs”),刷新网页,这样我们就可以看到历史的Network请求记录。比如下图:

第一次打开“index.html”页面时返回的是521, 内容是一段JS代码;第二次请求这个页面就得到了正常的HTML。查看两次请求的cookies,可以发现第二次请求时带上了一个cookie,而这个cookie并不是第一次请求时服务器发过来的。其实它就是JS生成的。

对策就是,研究那段JS,找到它生成cookie的算法,爬虫就可以解决这个问题。

二、JS加密ajax请求参数

写爬虫抓某个网页里面的数据,发现网页源代码里面没有我们要的数据,那就有点麻烦了。那些数据往往是ajax请求得到的。但是也不用怕,按F12打开Network窗口,刷新网页看看加载这个网页都下载了哪些URL,我们要的数据就在某个URL请求的结果里面。这类URL在Chrome的Network里面的类型大多是XHR。通过观察它们的“Response”就可以发现我们要的数据。

然而事情往往不是这么顺利,这个URL包含很多参数,某个参数是一串看上去无意义的字符串。这个字符串很可能是JS通过一个加密算法得到的,服务器也会通过同样的算法进行验证,验证通过了才认为你这是从浏览器来的请求。我们可以把这个URL拷贝到地址栏,把那个参数随便改个字母,访问一下看看是不是能得到正确的结果,由此来验证它是否是很重要的加密参数。

对于这样的加密参数,对策是通过debug JS来找到对应的JS加密算法。其中关键的是在Chrome里面设置“XHR/fetch Breakpoints”。

​三、JS反调试(反debug)

前面我们都用到了Chrome 的F12去查看网页加载的过程,或者是调试JS的运行过程。这种方法用多了,网站就加了反调试的策略,只有我们打开F12,就会暂停在一个“debugger”代码行,无论怎样都跳不出去。它看起来像下面这样:

不管我们点击多少次继续运行,它一直在这个“debugger”这里,每次都会多出一个VMxx的标签,观察“Call Stack”发现它好像陷入了一个函数的递归调用。这个“debugger”让我们无法调试JS。但是关掉F12窗口,网页就正常加载了。

解决这种JS反调试的方法我们称之为“反-反调试”,其策略是:通过“Call Stack”找到把我们带入死循环的函数,重新定义它。

这样的函数几乎没有任何其它功能只是给我们设置的陷阱。我们可以把这个函数在“Console”里面重新定义,比如把它重新定义为空函数,这样再运行它时就什么都不做,也就不会把我们带人陷阱。在这个函数调用的地方打个“Breakpoint”。因为我们已经在陷阱里面了,所以要刷新页面,JS的运行应该停止在设置的断点处,此时该函数尚未运行,我们在Console里面重新定义它,继续运行就可以跳过该陷阱。

四、JS发送鼠标点击事件

还有些网站,它的反爬都不是上面的方式。你从浏览器可以打开正常的页面,而在requests里面却被要求输入验证码或重定向其它网页。起初你可能一头雾水,但不要怕,认真看看“Network”或许能发现些线索。比如下面这个Network流里面的信息:

​认真观察后发现,每点击页面的的链接,它都会做一个“cl.gif”的请求,它看上去是下载一个gif图片,然而并不是。它请求时发送的参数非常多,而且这些参数都是当前页面的信息。比如包含了被点击的链接等等。

我们先来梳理一下它的逻辑。JS会响应链接被点击的事件,在打开链接前,先访问cl.gif,把当前的信息发送给服务器,然后再打开被点击的链接。服务器收到被点击链接的请求,会看看之前是不是已经通过cl.gif把对应信息发过来,如果发过来了就认为是合法的浏览器访问,给出正常的网页内容。

因为requests没有鼠标事件响应就没有访问cl.gif的过程就直接访问链接,服务器就拒绝服务。

明白了这个过程,我们不难拿出对策,几乎不需要研究JS内容(JS也有可能对被点击链接进行修改哦)就可以绕过这个反爬策略,无非是在访问链接前先访问一下cl.gif即可。关键是要研究cl.gif后的参数,把这些参数都带上就万事大吉啦。

结尾

爬虫和网站是一对冤家,相克相生。爬虫知道了反爬策略就可以做成响应的反-反爬策略;网站知道了爬虫的反-反爬策略就可以做一个“反-反-反爬”策略……道高一尺魔高一丈,两者的斗争也不会结束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反爬虫的四种常见方式-JS逆向方法论 的相关文章

  • 在 Web 浏览器中查找触发 then 事件的 jQuery 代码

    我加入了一个团队来从事一个项目 现在他们使用 jQuery 并且很多 javascript 文件都是外部文件而不是嵌入的 当我点击一个按钮时 它看起来就像 a class button cancel Cancel a 它触发一个在一个 ja
  • 如何理解 Angular JS 中的控制台错误消息?有什么工具吗?

    我是 Angular JS 的新手 我的第一个问题是如何理解 Angular JS 中控制台的错误消息 我编写了这段用于匹配密码的代码片段 它在控制台上抛出错误 但它工作正常 它是有线的 我无法从这些控制台消息中理解任何内容 谁能指出我为什
  • 计算Javascript中两次点击之间的时间

    我想用 javascript 计算属性的两次点击之间的时间 但我不知道如何 例如 a href click here a 如果用户单击多次 假设 5 秒内 我想显示警报 如果有帮助的话我正在使用 jQuery 我对 javascript 不
  • 在浏览器中语音聊天? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们正在寻求建立一个小组 voice 使用服务器上的node js 在浏览器中聊天 这可能吗 如果您希望您的解决方案是基于服务器端和客
  • 将 jquery-mobile 与 Webpack 结合使用

    我正在尝试使用 webpack 加载 jquery mobile 但到目前为止还没有运气 我知道 jquery mobile 依赖于 jquery ui 而 jquery ui 又依赖于 jquery 如何在 Webpack 中设置这样的场
  • 未捕获的引用错误:myFunction 未定义[重复]

    这个问题在这里已经有答案了 这到底是怎么回事 http jsfiddle net sVT54 http jsfiddle net sVT54
  • Ember.JS - 如何在同一页面中使用多个模型、控制器和视图?

    我主要了解 Ember JS 的基础知识 大多数示例实际上只处理单个控制器和模型以在页面上显示某些内容 我真的很想用 Ember 构建一个完整的 Web 应用程序 所以有人能告诉我如何组织和连接多个控制器 模型和视图到一个页面中吗 例如 如
  • 如何使用 jQuery 向表中添加新行,并为其分配递增的 id

    我有一个现有的 HTML 表格 它是用户输入 GPS 点的表单的一部分 用户还可以选择上传 GPS 数据点 我想要一个用户可以按下的按钮 其中一些 Javascript 会向表中添加一个或多个新行 但新行必须继续增加表中使用的名称和 id
  • AJAX:检查字符串是否为 JSON?

    我的 JavaScript 有时会在这一行崩溃 var json eval this responseText 当争论时会导致崩溃eval 不是 JSON 在进行此调用之前有什么方法可以检查字符串是否为 JSON 我不想使用框架 有什么方法
  • 访问 TypeScript 数组的最后一个元素

    TypeScript 中有访问数组最后一个元素的符号吗 在 Ruby 中我可以说 array 1 有类似的东西吗 您可以通过索引访问数组元素 数组中最后一个元素的索引将是数组的长度 1 因为索引是从零开始的 这应该有效 var items
  • 使用 jquery 将字符串数组转换为整数

    我正在尝试将 jquery 中的字符串数组转换为整数数组 这是我的尝试 var cdata data values split each cdata function i l l parseInt l 我认为在这种情况下你不需要使用 Jqu
  • 如何从顺序键盘导航中删除 Vuetify 附加图标

    在带有 Vuetify 的 Vue js 应用程序中 我有一组用v text field并且其中有一个append icon为了切换文本可见性 如下所示
  • 如何将 Browserify 与外部依赖项一起使用?

    我正在尝试慢慢地将 Browserify 引入我的网站 但我不想重写所有 js 也不希望 jquery 和其他库的重复实例与我的 Browserify 版本捆绑在一起 如果我构建将 jquery 列为外部依赖项的模块 那么如何将其指向我的全
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • 从多维无穷大数组中删除数组元素

    我想删除一个特定元素 例如 我想删除元素id 76在下面的数组中 而且 数组可以无限地组合在一起 这里的问题是我无法刷新页面 因为我使用 Vue js 进行即时操作 如果我能做到这一点 我的下一个问题可能是如何在我现在想要的地方添加一个元素
  • 加载另一个 JS 脚本后加载

    这是我的代码 very big js file lots of html stuff 问题是 这些是异步加载的 有没有办法等待第二个脚本直到第一个脚本加载 如果您使用 jQuery 有一个非常简单的方法可以通过获取脚本 https api
  • 需要js、d3 和 nvd3 集成

    我面临整合的问题要求 questions tagged requirejs with d3 questions tagged d3 and nvd3 questions tagged nvd3 我找到了一个使用 require 的简单解决方
  • 您如何看待引导模式触发器的相应回调?

    On 引导模态 http getbootstrap com javascript modals 我们知道我们可以为触发器绑定事件 例如show or hide using show shown hide hidden 但此事件绑定仅适用于一
  • Restangular - _.contains() 不是一个函数

    如果您最近通过 Bower 更新了 Restangular 它将安装最新的 Lodash 新的 4 0 然而 这是一个问题 因为 Restangular Angular 现在会抛出错误 contains 不是函数 你怎么解决 解决方案非常简
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing

随机推荐

  • C#系列之ArrayList

    C 最核心的部分已经学习结束了 接下来我们将学习一些进阶知识点 学习完这些能够让你的程序更加完美 目录 1 ArrayList的本质 2 声明 3 增删查改 4 遍历 5 装箱拆箱 1 ArrayList的本质 ArrayList是C 为我
  • Yii2安装遇到Loading composer repositories with package information

    模仿yii2官网使用下面的指令 composer create project prefer dist yiisoft yii2 app basic basic 然后项目卡在这个地方 超时之后开始报下面的错误 curl error 28 w
  • 字符编码的常用种类介绍

    字符编码的常用种类介绍 第一种 ASCII码 ASCII American Standard Code for Information Interchange 美国信息交换标准代码 是基于拉丁字母的一套电脑编码系统 主要用于显示现代英语和其
  • QT .pro文件详解

    QT 指定工程中使用的Qt的模块 默认情况下会使用Qt 的core和gui模块 QT core gui 基础模块简介 https www cnblogs com lvdongjie p 4809319 html TARGET 指定所生成 e
  • vue实现用户点击按钮右侧滑动页面

    1 需求说明 移动端开发中 用户点击标签元素实现右侧滑出页面 2 效果图 3 源码实现
  • 线性回归、Arima和LSTM做单特征预测

    一 数据集展示 1 本文只针对单特征的时间序列 这里分别只有时间和牛肉批发价两个特征 一共是三百多条数据 二 模型 1 线性回归 任务 只以当前的牛肉批发价作为特征 预测过后5天的牛肉批发价 1 线性回归需要有x和y两个维度 这里将原本的牛
  • JavaWeb新闻发布系统案例4

    会话管理 会话概述 双方的交流或交互 计算机中也是 浏览器和服务器的交互称之为会话 一次会话中包含多次请求和响应 会话功能 在一次会话的范围内的多次请求间 共享数据 功能 限制页面的访问 后台的页面在非登录的情况下是不能进行访问的 临时的存
  • memcpy、strcpy、snprintf的区别

    http hi baidu com wlibo666 item 7cfdb717454099d4be9042f5 这些函数的区别在于 实现功能 以及 操作对象 不同 strcpy 函数操作的对象是 字符串 完成 从 源字符串 到 目的字符串
  • html5嵌套表格的使用,嵌套表格的HTML5有效性

    我正在寻找表格中HTML5的规格 我在做一个web应用程序有很多数据表 嵌套表格的HTML5有效性 这些表通常有一个数据库行映射到一个表行 一切都很好 但是 一个特定的问题孩子有很多列 它需要分布在表中的两行上 所以普通的表是 伪 Head
  • 2023测试工程师全新技术栈,吃透这些,起薪就15k

    相信每个准备软件测试面试的同学 不管你是大学刚毕业 满心憧憬着进入公司实习 非计算机行业转行软件测试 自学测试就业还是培训后就业 都会面临着众多的疑问和不解 那就是该怎么走出着第一步 今天本文一次性告诉你 该怎么准备 本文共10000 字
  • Spring Cloud高可用之熔断器 - Hystrix

    一 Hystrix高层示意图 1 调用 Main 方法 2 业务验证 1 判断有没有缓存 2 判断熔断有没有开启 3 判断限流有没有触发 4 判断业务执行有没有失败 5 判断业务执行有没有超时 6 所有的失败都会触发fallback 3 业
  • WebStorm开发应用——前端页面 2

    相比于上一篇博客 WebStorm开发应用 前端页面 这次又做了一个登录页面 就是这个样子 我们都知道登录时账号和密码和如果正确的话 就跳转到相应页面上 那么该如何实现这一功能呢 如果是账户密码固定的话 利用js脚本可以这样写来做一个简单判
  • 03-springcloud的优缺点?以及Springboot的区别?

    在面试的过程中经常问道 你这个项目的选型是怎么样的 为什么会这样选型 以及和某某知识点的区别 你是怎么理解的 那么我们就通过这个问题来谈谈springcloud的优缺点吧 第一个问题 springcloud的优缺点 优点 1 耦合度比较低
  • 卷积神经网络的简单理解

    文章目录 1 灵感来源 2 定义 3 卷积神经网络结构 3 1 数据输入层 Input layer 3 2 卷积计算层 CONV layer 3 3 ReLU激励层 ReLU layer 3 4 池化层 Pooling layer 3 5
  • unity timeline的使用

    一 简单了解 timeline 可以用来做什么 所以 timeline 可以用来做一些技能技能 剧情动画等等 想剪辑视频一样 在时间先做做各种动画 配音等操作 二 简单使用 1 在window secquencing打开timeline编辑
  • Qt容器之QMap

    QMap属于关联式容器 其底层结构是通过二叉树实现 故其查找value的效率很快 QMap中的数据都是成对出现的 第一个称为key 键 第二个称value 键值 定义 QMap
  • 2019年11月中国大陆编程语言排行榜

    2019年11月2日 我统计了某招聘网站 获得有效程序员招聘数据9万条 针对招聘信息 提取编程语言关键字 并统计如下 编程语言比例 rank pl percentage 1 java 33 62 2 c c 16 42 3 c sharp
  • 堆栈brk指针

    内存分配的原理 从操作系统角度来看 进程分配内存有两种方式 分别由两个系统调用完成 brk和mmap 不考虑共享内存 1 brk是将数据段 data 的最高地址指针 edata往高地址推 2 mmap是在进程的虚拟地址空间中 堆和栈中间 称
  • 2016 World Final L Swap Space

    题意 有n个磁盘 大小为a 要更新成b 问最小需要多少个多少额外的开销能完成更新 并且没有数据损失 思路 先做a i lt b i 的 再做a i gt b i 的 a i lt b i 的按照a i 从小到大排序 a i gt b i 的
  • 反爬虫的四种常见方式-JS逆向方法论

    现在的网页代码搞得越来越复杂 除了使用vue等前端框架让开发变得容易外 主要就是为了防爬虫 所以写爬虫下的功夫就越来越多 攻和防在互相厮杀中结下孽缘却又相互提升着彼此 本文就JS反爬虫的策略展开讨论 看看这中间都有着怎样的方法 一 JS写c