一、反爬点
- 案例网址,向下滚动加载页面时的请求参数反爬signature,
明显的特征:acrawler.js以及window)._$jsvmprt("
二、反爬分析
-
参考文章1,参考文章2,参考文章3
-
1、采用搜索关键词
signature
定位,然后下断点,继续加载页面
-
进入S函数,在return o即signature,经分析得最后一句就是
var o = window.byted_acrawler.sign.call(n, i)
, 也就是signature是window.byted_acrawler.sign函数生成的
-
继续下一步调试,进入到
window.byted_acrawler.sign
函数,此时进入到一个新的js文件里了acrawler.js
(只有650行),传参如图,即可生成结果
-
本次采用复制全部js代码通过
补环境的方法
来生成signature,而非局部扣函数补函数的形式;什么是补环境可以看这篇文章 ,所以我们将acrawler.js
文件全部复制下来,如下,该文件内容放在该网站console界面可以直接运行出结果,那我们直接在本地里面再试试看
-
鉴于js的第一句判断了window是否=undefined,如果=undefined则glb=global(node环境global是全局变量),否则glb=window(浏览器window是全局变量),所以我们先补个window对象(有两种方法,
①本地js先用jsdom补充一个window,②window=global
),本次采用window=global的方法;
-
小插曲知识点:
日志断点又称插桩
,可以在console界面输出A变量值以及S[R][A]值;此处可以补很多东西,但是我们先看报错再后面挑着补
-
小插曲知识点:
条件断点
,当A变量等于referrer时会自动debugger住
-
第一次运行报错如下,补环境
document.referrer
,右击打上条件断点,然后刷新网页
-
第二次运行报错如下,缺少
sign
这个函数
-
第二次运行报错原因分析,js文件检测了是否是node环境,如
exports
只在node环境下存在,但是浏览器是undefined,所以我们直接把"undefined" != typeof exports ? exports : void 0
替换成浏览器输出的结果undefined
-
第三次运行报错是
href
,调试运行发现需要补href : 'http...................
-
第四次运行报错是
length
,调试运行发现需要补protocol: 'https:'
-
第五次运行报错是
userAgent
,补useragent
-
第六次运行,正常了,生成了一个较短的signature,由于检测不严格,所以这个短的也能用
-
据前辈介绍signature长短和cookie的长度有关,所以打上条件断点,然后我们再补个cookie,而且document.cookie的位置得往后放,否则可能被删除清空什么的;还有signature如果不成功的话,有可能就是此处281行出了问题,可以对比的继续补环境