分析mangabz.com的漫画图片加载方式
最近正在用python写一个下载在线漫画的程序,其中一个漫画网站就是这个mangabz.com。在加载图片的时候,图片并不是在网页中静态加载的,而是通过Ajax动态获取图片链接再显示。其实可以通过模拟浏览器访问的方式来直接获取,但是这样效率有点低,有没有别的方式呢?
打开浏览器的开发者工具,可以看到加载完成后的网页中包含了图片:
但是,这是动态加载后的结果,关闭JS之后再刷新,图片就加载不出来了:
翻一下JS内容,在chapter.js里面找到一个“ajaxloadimage()”,根据函数名字判断,这应该就是加载图片的关键。
在这个函数里,通过Ajax向chapterimage.ashx发送请求,那么请求的参数都是些啥呢?
其中,参数”key“的值mkey是一个空字符串,在函数开头就能看到。
其他几个值都是全大写,应该是常量,在chapter.js里找不到,不妨回到之前的章节网页去看看:
知道了URL和请求参数,现在可以看看这个请求得到了什么响应内容:
这是一段混淆过的JS脚本,试试看直接执行可以得到什么:
出现了!这个数组的第一项就是这一页的图片地址。
以上操作都是在浏览器中进行的,知道了过程,接下来就可以用python来操作了。
简单来说就是以下几个步骤:
1. 访问章节网址,得到网页内容(text)
2. 用正则表达式找到上述几个变量的值,对chapterimage.ashx发送请求,得到JS脚本
3. 用execjs模块运行这个脚本(execjs.eval()),得到图片的地址。
4. 如此访问每一页,直到得到404,说明已经访问了每一页,这样就得到了所有的图片。
附上python的代码片段:
[Python] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | page_no = 1 img_urls = [] while True : page_url = url + '-p' + str (page_no) + '/' r = requests.get(page_url) if r.status_code = = 404 : break cid = re. compile ( 'var MANGABZ_CID=[^;]*;' ).findall(r.text)[ 0 ].lstrip( 'var MANGABZ_CID=' ).rstrip( ';' ) _mid = re. compile ( 'var MANGABZ_MID=[^;]*;' ).findall(r.text)[ 0 ].lstrip( 'var MANGABZ_MID=' ).rstrip( ';' ) _dt = re. compile ( 'var MANGABZ_VIEWSIGN_DT=[^;]*;' ).findall(r.text)[ 0 ].lstrip( 'var MANGABZ_VIEWSIGN_DT="' ).rstrip( '";' ) _sign = re. compile ( 'var MANGABZ_VIEWSIGN=[^;]*;' ).findall(r.text)[ 0 ].lstrip( 'var MANGABZ_VIEWSIGN="' ).rstrip( '";' ) img_ajax_url = page_url + 'chapterimage.ashx' params = { 'cid' : cid, 'page' : page_no, 'key' : '', '_cid' : cid, '_mid' : _mid, '_dt' : _dt, '_sign' : _sign } ajax_r = requests.get(img_ajax_url, headers = headers, params = params) img_url = execjs. eval (ajax_r.text) img_urls.append(img_url[ 0 ]) page_no + = 1 |
CBB智能量化》原创,转载请保留文章出处。
本文链接:https://bk.qcsj.cc/post-781.html
版权声明:若无特殊注明,本文为《正文到此结束
发表吐槽
你肿么看?
既然没有吐槽,那就赶紧抢沙发吧!