Python爬虫实战H04js加密混淆及简单反调试图文教程

2024-12-30阅读数:54
上一篇:Python爬虫实战H05js逆向破解时间戳反爬图文教程
下一篇:Python爬虫实战H03网页滚动加载的原理及爬取(JavaScript加密混淆逆向基础)图文教程

打开Python爬虫实战练习页面js加密混淆及简单反调试_H04_Spiderbuf,可以看到页面内容是由NordPass发布的2022年全球最常用密码列表,总共30条数据。

在网页上点击右键 > 显示网页源代码,可以看到网页结构也并不复杂。HTML代码并不多,总共就90行,但在源码当中没有看到页面上显示的内容,这种情况一般是由JavaScript动态加载并渲染内容的。

F12打开谷歌浏览器开发者工具,我们就会看到自动停留到了Sources(源码)标签面,并且中间代码的位置停留在了第73行deebugger的代码行,右上方出现了“Debugger paused”字样,页面上也出现了“Paused in debugger”的字样。

刷新一下页面,发现出现了同样的情况。切换到开发者工具Network标签页,没有看到有加载数据的请求,但加载了一个js文件。这种情况就有可能是数据已经写在js文件里面了。

udSL29.js

点击udSL29.js,在右边展开的详情中切换到Response(响应),就能够看到JavaScript代码。而且这些代码混淆程度不高,对代码分析的干扰微乎其微,那我们就直接分析一下这些JavaScript代码。

第1行是一个data变量,值的格式就是一个json,内容很像unicode编码。往下拉到这个变量赋值结束,下面的几行代码出现了getElementById、insertRow、insertCell、innerText这些关键字,不难看出这里就是把data的内容赋值到了表格里面。

因为getElementById是根据HTML元素ID获取元素,insertRow、insertCell通常是给表格插入行跟单元格,innerText是给HTML元素赋值用的。

也就是说我们只要获取到这个js文件,并把变量data中的值提取出来,再转码就能得到我们想要的数据了。至于这种情况的转码,推荐使用Python的eval函数。

有了猜测我们就开始写代码验证。

url = 'http://spiderbuf.cn/static/js/h04/udSL29.js'
js_code = requests.get(url, headers=myheaders).text
a = js_code.index('=') + 1
b = js_code.index(';')
js_code = js_code[a:b]

# 将字符串转换为字典
dict_data = eval(js_code)
print(dict_data)
for item in dict_data:
    print(item)

运行代码就发现我们已经拿到我们想要的数据了。

通过刚才的JavaScript代码分析,这个页面并没有做针对selenium等模拟浏览器的检测,也就是说我们同样可以使用selenium来获取数据。

client = webdriver.Chrome()
client.get(url)
html = client.page_source
print(html)
client.quit()

已经实现了爬虫的代码编写,回头解决一下Paused in debugger的问题。

这通常是使用代码混淆工具对JavaScrit代码进行混淆时自动加入的,也有些是开发者手工加入的,现在这个网页就明显是手工加的。作用就是干扰爬虫开发者对代码进行调试,因为只要一运行就会跳到debugger的位置,让人无法调试其它代码。

解决方法有多种,最简单的就是在开发者工具停留的界面debugger这行代码上右键 -> 点击Continue to here,这样就不会在这里停顿了,但这个方法在每次刷新后都要重新做一次。

Continue to here

完整示例代码:示例代码