python 爬取漫画简易爬虫

今天闲的无聊,所以准备看看漫画,但是发现大多数的漫画一页一页翻,可能会来不及加载,但是确实是很想看接下来的内容,慢慢等的话确实有点难受。

所以准备用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

如果有什么不懂的可以在评论区留言,我会在看到的第一时间进行回复的。

python 爬取漫画简易爬虫

作者

datehoer

发布于

2021-01-08

更新于

2023-10-19

许可协议

评论