爬虫进阶:教你如何突破网站文字加密

反爬与反反爬一直是一个相互博弈的游戏。道高一尺,魔高一丈,知己知彼方能百战不殆,想要突破网站的反爬机制,你必须深入了解当下的前端开发技术,才能在这个游戏中生存下去。

本人是一名爬虫爱好者,最近在爬一个小说网站时,通过抓包分析,发现小说正文被加密过了,如图所示:

获取小说正文的响应数据

小说正文加密数据

根据字面意思可以看到,小说正文是编码保存在Content这个键中,但这种字符编码不能显示解码出来,遂认定它经过了加密处理。这个时候我们就要查看网页js代码分析编码转换过程了。但是一个网页的js代码是非常多的,并且也经过编译混淆压缩,所以直接通篇看是耗费精力的。所以我们要掌握一定的技巧,才能更有效率的解决问题。

接下来,我分享下我查看js代码的一些经验。

首先,看这个请求地址,可以发现"index.php/Bookreader"是这个url中固定的部分,

然后,我们按快捷键Ctrl+Shift+F 搜索,结果如下

点击这条结果,定位位置

可以看到,这个接口路径赋值给了变量getChapterContentAjaxUrl,接下来,搜索这个变量,看它被调用的位置。

由经验知,点击最下面这个,打开js代码页面

看到这个代码逻辑,相信你已经看懂了,在这个POST请求成功后,返回json数据,然后对json的Content字段进行解码,在第754行有一个函数“_decryptByBaseCode”是实现解码功能的函数,OK,接下来看这是函数的具体实现就好了。

在这地方下断点,命中断点后

点击F9单步执行,跟踪进去

函数_decryptByBaseCode的实现代码

可以看到,这个解码逻辑非常简单,将text用反斜杠分割为数据,然后逐个进行解码。

这里有两个函数String.fromCharCode和parseInt,第一个是将int转为unicode字符,第二个是将字符串按指定进制转为int,这里他们用的是30进制进行编码加密的。

所以这个函数我们完全可以用python实现。实现代码如下, 


# 解码
def decrypt_by_basecode(text,base):
    if not text:
        return
    # base=30
    arrStr = []
    arrText = text.split('\\')

    for i in arrText:
        if i:
            s = chr(int(i,base))
            arrStr.append(s)
    objStr = ''.join(arrStr)

    return objStr

写好解码函数后,我们就可以在程序中调用这是接口,然后解码小说内容了。

通过以上的实战演示,可以看到一名优秀的爬虫工程师,也必是一名资深前端工程师。

欢迎大家关注我的知乎账号 

@arckal sun

 我会不定期的分享一些技术经验的。^_^

猜你喜欢

转载自blog.csdn.net/u014108439/article/details/81279574