拷贝漫画的漫画多,但有时候会崩,手机端没法直接在网站上看,对我这种在校内软件被管控,校园网依托石的的高中畜很不友好。把漫画爬下来看可以解决问题。
我们要达成的目标就是能把一部或几部漫画所有章节的图片下载下来。
那首先就要分析漫画的章节信息。打开f12查看发包,但你会发现Sources界面被debugger断住,往下走还会跳转到空页面:
这种情况下根本没法调试。好在妨碍调试的逻辑很明确,都在loop函数里。我们右键文件,选择override代码,然后把loop里的代码删了:
这样就不会卡在这了。
接着我们需要找到获取数据的接口。
试了试后发现搜不出章节名,不过在Fetch/XHR里还是能很快找到接口:
这就很明显了,拷贝漫画的网站对数据进行了加密,导致我们搜不出数据。
这种情况下解决方法很多,不过我们先得判断加密的类型,一般这种数据的特别长的密文大概率是对称加密,其中很大可能是AES。
所以我们搜一下`decrypt`,看看能不能找到解密的位置:
嗯……乱七八糟一坨不想看。
那接下来再试试相对简单的方法:Json Hook。
由于前后端的数据传输基本都靠json,所以基本上前端都会有将json数据解码为对象的地方。如果传过来的加密数据解密后也是json格式,那也会有json解码的过程。
因此,如我们在进行json解码的时候下断点,就能定位到解码的位置。
在油猴里创建一个脚本,输入代码:
这段代码简单来说就是重写了一遍JSON.parse,在真正执行逻辑前加入一个断点。
然后刷新漫画页面,发现它断住了:
打印obj是返回的加密数据,看来是能断到。
再跳一次:
这次就直接把明文数据给断出来了。这下肯定能定位解密位置了。
我们顺着栈往上找一层:
根据数据我们可以知道数据解密肯定是在这一片。
这个文件的代码全部混淆过了,乱七八糟的,很难看。
不过通过`iv` `mode` `padding` 这三个关键词,我们也能知道这是标准的crypto-js库AES算法。
这段混淆过的代码按理应该用AST狠狠地解混淆,但AST的篇幅太长了,在这是写不完了(。
当然如果我们挨个执行`_0x4faf`函数也能把代码解混淆,这里直接贴代码了:
事实上没必要解,因为反正我们是复制粘贴使用(。
这里唯一的未知变量是`dio`(我不做人啦!),但我们往代码上面找找就能得到dio是个定值`"xxxmanga.woo.key"`。
这样我们就能通过这段代码处理加密的数据了。
至于怎么处理解密后的数据?写Python的时候再说。
分析漫画页面时,我们很快就会遇到一个问题:Network里找不到获取图片url的api
找不到api可难顶,根本找不到切入口。
我当时使用DOM断点解的,不过现在看来没必要。我们继续用Json Hook:
可以看到直接hook住了所有图片的url列表。
我们还是沿着栈找:
它还是一大串解密的代码,刚刚解过,不分析了。
只是刚刚的解密代码,加密数据是api给的,那这的加密数据在哪?
我们可以搜,当然这里直接打开Elements界面,我们就能看到这一串玩意儿:
这就是拷贝漫画图片url的存放位置……
真是迷迷又惑惑啊,你们其他网站有这样的反爬吗?(瑞数怎么你了?)
不过这设计某种意义上挺令人欢喜的(,至少这段密文不是一段JS代码。
这样,如何爬取网站已经分析完了,可以写Python了。
(因为这代码是很久以前写的,所以可能有些变量名等与上面的分析不一样,看官见谅)
为了去处理那加密数据,我使用了execjs库,通过执行js代码来解密数据。
execjs库用`pip install pyexecjs`就可以安装,注意pycharm没法帮你安装。
我们把解析过了的代码稍微整理包装一下:
这里需要先安装`crypto-js`库。我使用的是node.js环境,用`npm install crypto-js`安装。
这段代码里`require`是旧的CommonJS写法,python里执行也是用的这个。
如果在nodejs环境下运行报错,把你目录下`package.json`文件里`"type": "module"`这一行删了就行了。
运行完之后可以得到解密的数据,格式大概长下面的样子。
章节信息:
图片信息:
下来思路就明确了:
通过漫画名请求漫画页面解密获取漫画章节列表
通过章节ID请求章节网页获取信息后解密获得图片列表
请求图片url下载
这里为了提高下载的速度,使用了协程。但我不打算展开说了,因为没啥时间了(。
直接上代码:
运行程序,可以看到很快便爬取了所有图片:
结尾
很早之前我就想写这篇,结果一直咕咕,拖到了今天(。
今天是放假,明天又要上学,正好晚上想起了今天是自己生日,觉得生日啥事不干也不合适吧,就赶了一篇。
写得很糙,Python代码都没有细展开,只能说没啥时间了,再拖就要到明天了。
说起来上一篇爬dmzj的文,我当时只是一时兴起,记录了一下自己的爬虫经历,没想到居然有人看了,而且还有人关注了我,真的,非常感谢。