今天闲的无聊,所以准备看看漫画,但是发现大多数的漫画一页一页翻,可能会来不及加载,但是确实是很想看接下来的内容,慢慢等的话确实有点难受。
所以准备用Python写一个爬虫,来爬取相关的资源,下载到本地,之后用键盘的左右键翻看就好了。大不了在爬取漫画的过程中干点别的。
因为那个网站有点不可描述,所以我就简单说下过程,不贴图了。
首先是分析一下这个漫画的链接,是从哪里得到的。我这个是虽然有img但是实际上他的图片储存在了data-src里,所以我们先copy一下他的xpath //*[@id="content"]/div[2]/div[4]/a/img
然后将img后面添加上@data-src就能获取这个属性的内容了。
之后我们需要写一个解析页面的代码,然后将解析出来的图片进行保存就好了。这里我是用的函数来写的,方便维护,毕竟Python爬取漫画还是挺多代码的。
1 2 3 4 5 6 7 8 9
| def get_links(url): """获取所有的链接""" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36" } pagehtml = requests.get(url, headers=headers) pagehtml_jiexi = etree.HTML(pagehtml.content.decode('gbk')) links = pagehtml_jiexi.xpath('//*[@id="image-container"]/img/@data-src') return links
|
首先是解析一下内容,先全部阅读漫画内容,让所有的图片在同一个页面上,之后获取所有的图片链接,再进行爬取。
然后就是判断图片的格式,这个是因为我爬的漫画是由png格式或者jpg格式的,所以写了个判断。
1 2 3 4 5 6
| def judge_picture(url): """判断图片的格式""" examplelink = url.pop() pictureformat = re.findall(r'.*([a-z]{3})', examplelink) pictureformat = pictureformat.pop() return pictureformat
|
然后再就是进行下载了。这里用到了if,根据格式来命名。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| def downloads(newlink): """下载""" links = get_links(newlink) document_name = get_name(newlink) picturefotmat = judge_picture(links) a = 1 if picturefotmat == "jpg": for link in range(len(links)): if a % 50 == 0: time.sleep(30) onelink = links.pop() picture_info = get_pictureinfo(onelink) pictureid = re.findall(r'.*/([0-9]*).jpg', onelink) pictureid = pictureid.pop() with open(document_name + '/' + pictureid + '.jpg', 'wb') as mh: mh.write(picture_info) print("已完成" + pictureid + '.jpg') a += 1 elif picturefotmat == 'png': for link in range(len(links)): if a % 50 == 0: time.sleep(30) onelink = links.pop() picture_info = get_pictureinfo(onelink) pictureid = re.findall(r'.*/([0-9]*).png', onelink) pictureid = pictureid.pop() with open(document_name + '/' + pictureid + '.png', 'wb') as mh: mh.write(picture_info) print("已完成" + pictureid + '.png') a += 1 totalinfo = "文件夹:" + document_name + ",漫画链接:" + newlink + '\n' with open('downloadinfo.txt', 'a') as info: info.write(totalinfo) print("完成")
|
之所以加了一些print,是因为爬取的过程中太无聊了,没有提示的话会疯掉的。
然后 重点说一下为什么要用到time,以及前面的try,time是因为反爬,虽然我爬的网站大概率没有,但是每隔多少图片休息一下还是好的。
之后那个try是为了防止超时,如果有自己写过的话,会发现有的时候爬着爬着,就不动了。这就是超时了,所以加上一个try进行抓取,如果超时就进行重新获取,然后如果3次都不行的话,就继续下一个。
当然实际上到底是不是这么写,我也不清楚,因为我确实没遇到超时的报错,因为我之前没加timeout,所以他会一直卡在一个地方不动,然后我直接加了timeout和try了。
具体的代码可以看我的GitHub库:https://github.com/datehoer/yellow
如果有什么不懂的可以在评论区留言,我会在看到的第一时间进行回复的。