《眼儿媚·朦胧雾》
身世飘零叹孤独 回顾盼相扶 情天不老 雷霆易逝 雨过云舒
相思不忍轻离别 携手更如初 风急波涌 扁舟不系 终恋江湖
最近有妖气上《鬼刀》停止更新了,Bilibili漫画上的又不能下载保存到本地,加上最近正在玩StyleGANs,需要一些动漫图片做训练数据集,所以搞个爬虫从Bilibili漫画上爬了个《鬼刀》全集。
工程师的乐趣就是这么简单!
本文介绍一下爬取的方法。
话说,《鬼刀》的画作真实细腻到极致了,王凌真是吾辈程序员楷模,作者目前也在学画画,道阻且长啊。
爬取彼岸图网的爬虫:
爬取百度图片的爬虫:
首先,这是爬取成果:
本文以《鬼刀》为爬取目标,其他漫画可以此类推。
目录:
1.网页分析;
2.XHR解析;
3.爬取流程;
4.魔高一丈之反反扒
1.网页分析
基础url:https://manga.bilibili.com/mc29481/553155?from=manga_detail
这个网址中关键的是两个字符串:“mc29481”和“553155”,前者是《鬼刀》的漫画编号,后者是章节编号,553155是第0画,553156是第1画,但是........以此不类推,章节编号没有规律,这也算是一种反扒策略吧。
按F12进入开发者工具 -> 选择network -> 选择XHR,如下图:
漫画图片是通过Ajax动态加载的,这里关键的请求有3个:GetImageIndex...,ImageToken...和ComicDetail.....,这3个都是POST请求,从中得到漫画图片的真正url。
2.XHR解析
首先看ComicDetail.....
可以得到所有的ep_id,即章节编号,这个是倒序排列的,第一个代表最后一话。
然后看GetImageIndex...
请求参数ep_id是章节编号,响应数据是一堆JSON数据,其中的‘/bfs/manga........jpg’是需要的图片基础路径。
这个数据需要做一些处理作为ImageToken...的请求输入。
最后是ImageToken...:
ImageToken...的请求输入是之前GetImageIndex...得到的/bfs/manga........jpg’添加一些字符串,如上图所示。
Note:这里有一个问题,这里的"@1100W"在不同的章节里是不同的,以鬼刀为例,有些是"@1100W"有些是"@1088W",且没有规律,这个字符串不知道从哪获取,作者在XHR对象里没有找到,在HTML里倒有,但这个HTML也是动态加载的,但是,不影响爬取,无论是"@1100W"还是“@1088”都可以正常爬取,这个值影响获取的图片的宽度,"@1100W"代表图片宽度尺寸1100,作者使用7000,得到的图片宽最大为2500,这个应该是最大值了。
最后得到漫画图片的真实url:
使用这个url发送GET请求,即可得到漫画图片。
3.爬取流程
第一步,得到所有ep_id:
url = 'https://manga.bilibili.com/twirp/comic.v1.Comic/ComicDetail?device=pc&platform=web'
comic_id = 29481
response = requests.post(url=url, headers=headers_id, json=data).json()
headers从网页上照抄:
data为漫画编号即Comic_id:
获得所有ep_id:
第二步,获得图片基础路径:
url = 'https://manga.bilibili.com/twirp/comic.v1.Comic/GetImageIndex?device=pc&platform=web'
request = requests.post(url=url, headers=headers_path, json=data).json()
headers从网页上照抄,要改两个地方:
1.'accept-encoding' 需要注释掉,不然会报错,原因不明;
2.'referer'需要根据ep_id重新生成;
data为漫画章节号即ep_id:
获得该章节的所有图片基础路径:
第三步,根据得到的基础路径生成完整路径,然后获得图片url:
完整路径如上图,至于“@1100”目前暂未解决,由于《鬼刀》里的所有图片都是“@1100”或者“@1088”,所以本文使用笨办法,使用两种字符串各发起一次请求,使用"try...except"跳过错误。
headers从网页上照抄,要改两个地方:
1.'accept-encoding' 需要注释掉,不然会报错,原因不明;
2.'referer'需要根据ep_id重新生成;
根据返回的json文件,获得图片下载url:
第四步,使用图片url通过Get请求下载图片。大功完成!!!
4.魔高一丈之反反扒
针对B站漫画的反爬技术,使用了一些反反爬策略,本文爬取过程中没有被反爬过!
1.headers,POST请求时需要写全(有些参数需要注释掉),GET请求不能写全;
2.随机休息,时间可以长一点;
time.sleep(random.randint(5, 20))
3.headers里随机更换浏览器;
4.使用代理IP;
有空再做个软件界面封装一下。
最经有没有什么好看国漫推荐的啊,另外据说鬼刀要动画化了。
标签:...,Python,爬虫,爬取,headers,url,漫画,id,图片 From: https://blog.csdn.net/m0_59092412/article/details/139709875