今天给大家带来的依然是JS解密实战,我们的目标是阿里文学网。
随手点进一本书,通过谷歌浏览器来分析一下请求。很容易我们就发现这个XHR是一个GET请求,但是其请求链接包含了下图中的bookid,chapterid,ut,num,ver,aut参数。那么只要知道了这些参数,书本内容就会呈现在我们面前,也就是下图中的Chaptercontent。
这个英文数字符号组成的字符串对应的就是显示在浏览器上的章节内容,但是经过了加密,我刚看到这段字符串形式的还以为是和网易云阅读一样是简单的base加密,在本地进行简单地调试之后发现,猜测错误~还是得老老实实地关注js代码吧。
本次爬取的目标是某本小说的章节内容并存储至本地。现在摆在我们面前的是两个问题。其一是找到请求所包含参数,是藏在什么位置或是如何通过js生成的。其二是破解经过加密后的章节内容,得到和我们从网页上看到的一样的文字内容。那我们就可以开始分治我们的问题啦!
还是在之前所在的网页,点击查看页面源代码,在源代码中查询是否包含sign参数。
结果非常幸运地发现,各个参数就安静地躺在页面源代码上,这件事就变得相当容易了。用requests大法获取我们想要的html页面,用BeautifulSoup提取我们想要的部分,并解析成json格式。
接着从获取的json中提取我们想要的部分,获取该书主要信息,包含书名,作者名,章节数目,字数等,并提取每个章节的重要信息,包含章节名称,价格,url后缀。价格可以用来判断该目录是不是收费文章。
结合之前的分析 'https://c13.shuqireader.com/pcapi/chapter/contentfree/'是小说章节内容url的前半部分信息,后半部分是不同参数拼接而成,也就是网页源代码包含的参数内容。把url后缀与上述链接拼接起来我们可以得到包含加密content的数据,也就完成了任务的第一步。
好的,接下来要做的就是解密content了,让我们来分析一下其js。
从这个名称我们似乎就能看出一些什么,_getContByCid,通过章节id获得内容,十有八九解密的js就在里面,要把一串字符串解密成文字,在定义变量的时候应该需要赋值“ABCDEFG”等等,我们来搜索一下。
果不其然,这有个解密函数,_decodeCont,这是不是我们想要的呢,来验证一下。将js代码拷贝到WebStorm来运行一下。将加密内容送进解密函数,用控制台输出来看一下结果。
果然,字符串被正确解码成文字了。接下来我们只要调用python里的execjs库来执行js代码就可以了。使用这个库需要pip安装。
pip install PyExecJS
并且需要安装一个运行时的环境。execjs会自动使用当前电脑上的运行时环境,
execjs.get().name# 'Node.js (V8)'
然后我们就可以启动程序了,what?输出了一大堆error,我们来看看
编码错误?在读入js时,加一个encoding='utf-8'应该没问题了吧,结果依然报错。。这就有些令人困惑了,使用一波面向搜索引擎debug,最终解决了这个编码问题。其做法是修改subprocess.py文件,将'utf-8'设置成默认编码格式。
重新启动程序,完美,小说就下载到本地喽~
为了改造成一个小说下载器,我们需要遍历整个阿里文学网站,搜寻到所有小说的bid,这里requests大法就可以轻松做到。
这样每本小说的名字和id都用字典一一对应存储了。用户只需要输入其小说名,程序自动找到对应的bid并进行小说的爬取。下面是一个示例: