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

所以准备用python写一个爬虫,来爬取相关的资源,下载到本地,之后用键盘的左右键翻看就好了。大不了在爬取漫画的过程中干点别的。
因为那个网站有点不可描述 ,所以我就简单说下过程,不贴图了。
首先是分析一下这个漫画的链接,是从哪里得到的。我这个是虽然有img但是实际上他的图片储存在了data-src里,所以我们先copy一下他的xpath
//*[@id="content"]/div[2]/div[4]/a/img
然后将img后面添加上@data-src就能获取这个属性的内容了。

之后我们需要写一个解析页面的代码,然后将解析出来的图片进行保存就好了。
这里我是用的函数来写的,方便维护,毕竟python爬取漫画还是挺多代码的。
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格式的,所以写了个判断。
def judge_picture(url):
""" 判断图片的格式 """
examplelink = url.pop()
pictureformat = re.findall(r'.*([a-z]{3})', examplelink)
pictureformat = pictureformat.pop()
return pictureformat

然后再就是进行下载了。
这里用到了if,根据格式来命名。
def downloads(newlink):
""" 下载 """
links = get_links(newlink)
document_name = get_name(newlink)##获取单个链接
picturefotmat = judge_picture(links)#print(type(picturefotmat))
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库----GitHub库:https://github.com/datehoer/yellowpython 爬取漫画简易爬虫
如果有什么不懂的可以在评论区留言,我会在看到的第一时间进行回复的。

最后修改:2021 年 04 月 19 日 04 : 59 PM
如果觉得我的文章对你有用,请随意赞赏