爬虫中遇到的js反爬技术

article/2025/10/11 2:45:54

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

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

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

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

一 、JS写cookie

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

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

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

js写cookies

js写cookies

第一次打开“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-ajax请求

js-ajax请求

三、JS反调试(反debug)

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

js反调试

js反调试

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

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

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

 

四、JS发送鼠标点击事件

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

js鼠标轨迹跟踪

js鼠标轨迹跟踪

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

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

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

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

 

结尾

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


http://chatgpt.dhexx.cn/article/Dw4qNpuH.shtml

相关文章

Python爬虫之路-JS的解析

JS的解析 学习目标: 了解 定位js的方法了解 添加断点观察js的执行过程的方法应用 js2py获取js的方法 1 确定js的位置 对于前面人人网的案例,我们知道了url地址中有部分参数,但是参数是如何生成的呢? 毫无疑问,参数肯…

nodejs 爬虫

目标:爬取百度搜索到的女生头像(百度图片通用) 1. 下载node 可以去官网下载最新版node.js安装程序。(地址:node官网) 2. 下载需要的依赖(模块) 这里需要用到superagent模块和nod…

JS逆向爬虫(一)

目录 需要做的事情 一、安装与配置文档 1、node.js安装与配置 2、VSCode安装 3、在VSCode中运行 二、JS常用算法 1、md5 线性散列算法 2、DES/AES对称加密算法 3、RSA 非对称加密算法 4、base64 伪加密算法 三、js逆向案例 1、有道笔记翻译(MD5) 进行js代码调试的流…

爬虫中js的解析

每日分享: 做人要狠 任何关系,合得来就合,合不来就散,没有什么大不了的,理解多了,迁就多了,顾忌多了,痛苦自然就多了,完全没这个必要。别说我狠,以前我比谁…

Node.js爬虫实战:如何快速获取网站数据?

思考🤔 假设你正在为公司做市场调研,你需要获得一些能够提供关于你的目标受众的信息以进行研究,但是你发现这些信息并不能直接获取。你人工地搜索每个网站是不现实的,所以你需要一种更高效、更自动化、更快速的方式来获取这些信息…

Python爬虫:抓取js生成的数据

之前的NLP课程作业要求爬取一些科技新闻来训练语言模型,本文就简单来说一说用Python来爬取新闻的过程。虽然以前写过简单的爬虫,但是没有处理过浏览器动态加载数据的情况,这次碰到了就记录一下。 这次爬取的新闻来源是 新浪科技滚动新闻&…

js爬虫

互联网 Web 就是一个巨大无比的数据库,但是这个数据库没有一个像 SQL 语言可以直接获取里面的数据,因为更多时候 Web 是供肉眼阅读和操作的。如果要让机器在 Web 取得数据,那往往就是我们所说的“爬虫”了。现在项目需要,所以研究…

爬虫JS逆向思路 --(几千块钱都学不到的思路)

网络上几千块都学不到的JS逆向思路这里全都有👏🏻👏🏻👏🏻 本系列持续更新中,三连关注不迷路👌🏻 干货满满不看后悔👍👍👍 &…

手把手操作JS逆向爬虫入门(一)

本文爬取的网站如下(可以找解密工具解码) aHR0cHM6Ly9uZXdyYW5rLmNuLw 爬取的内容为网站的资讯情报版块的新闻资讯 鼠标点击翻页,在开发者工具中查看请求包,很容看出请求地址和参数, 其中post请求的参数如图&#x…

JS实现图片爬虫

最近在在学node.JS,尝试着跟着网上的教程学着写一个JS爬虫,来爬取网上的图片文件,在此记录过程 获取网站的html结构 首先我们引入node.js的http核心模块,初始化并将目标网站地址作为url参数,接受一个回调函数,在这个…

从零开始学JS爬虫,轻松抓取网页数据!

随着互联网的发展,网页已经成为人们获取信息的重要途径之一。而如何高效地获取所需信息,就成为了很多人关注的问题。本文将介绍JS爬虫入门,帮助读者从零开始抓取网页数据。 一、概述 在介绍JS爬虫之前,我们先来了解一下爬虫的基…

爬虫之JS的解析

JS的解析 学习目标: 了解 定位js的方法了解 添加断点观察js的执行过程的方法应用 js2py获取js的方法 1 确定js的位置 对于前面人人网的案例,我们知道了url地址中有部分参数,但是参数是如何生成的呢? 毫无疑问,参数肯…

JavaScript爬取网页并分析

JavaScript爬取网页并分析 任务分析 爬取三个网站下的新闻数据,这里选择网易新闻网(https://news.163.com/);提取每条新闻的如下字段:标题,内容,发表日期,网址&#xf…

js - 爬虫的实现

爬虫的原理 爬虫,就是一个自动爬取网页上展示的信息的工具。我们要写一款爬虫,就要满足下面的条件: 网络的请求。首先我们要进行网络请求,让目标给我们返回信息(常用的模块有http、http2、https、request、axios、pu…

Node.js实现简单爬虫 讲解

一、什么是爬虫 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕…

爬虫攻略(一)

互联网 Web 就是一个巨大无比的数据库,但是这个数据库没有一个像 SQL 语言可以直接获取里面的数据,因为更多时候 Web 是供肉眼阅读和操作的。如果要让机器在 Web 取得数据,那往往就是我们所说的“爬虫”了。现在项目需要,所以研究…

javascript爬虫

用js爬虫,使用到nodejs 例子中爬取的是中国新闻网时政频道的最新10条新闻的title和链接 事先准备: 1、先去node官网下载安装一下 2、推荐vs code,需要通过终端下载插件,不想的话用cmd小黑框做终端,记事本写代码也行…

用js写个爬虫

如何用js完成爬虫项目 前言一、node.js的安装二、mysql的安装三、确定爬取网页四、查看分析网页源码五、开始写爬虫npmNode调用mysql定义要访问的网站定义新闻页面里具体的元素的读取方式定义哪些url可以作为新闻页面构造一个模仿浏览器的request读取种子页面解析出种子页面里所…

Docker—容器数据卷

目录 1.什么是容器数据卷 2.数据卷的使用 3.实战MySQL同步数据 4.卷 常用命令 5.匿名挂载与具名挂载 5.1 匿名挂载 5.2 具名挂载 6.数据卷容器 1.什么是容器数据卷 Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过d…

docker删除已停止的容器

一、docker删除已停止的容器 1、根据容器的状态,删除Exited状态的容器 先停止容器、再删除镜像中的容器、最后删除none的镜像。执行命令如下: docker stop $(docker ps -a | grep "Exited" | awk {print $1 }) #停止容器 docker rm $(docke…