前言
- 好吧,我摊牌,写本篇文章的目的是为了蹭1024的徽章。虽然这样说,但读者依旧可以从中学到一些知识,比如,递归在爬虫中的应用,递归是编程中非常重要的内容,很多算法都离不开递归,本篇文章将为你讲解以递归代替循环来实现爬取漫画的所有章节,文章结尾附上全部代码。
需求
- 偶然想起初中爱看的一本漫画,名字叫做《偷星九月天》,当初真的是对这本漫画爱不释手,每天都期盼着更新。多年后的今天,想用代码爬下来所有章节重刷第n遍。
- 功能要求:能够将一本漫画的所有章节下载下来,并将每个章节分开存放在不同文件夹。
- 拓展要求:输入漫画名字,第几话到第几话自动下载所有页面。
找资源
找到符合爬虫要求的漫画网
- 比如某些网站它的图片存放地址为https://xxx.xxx.xxx/偷星九月天/1.jpg ,那我们就可以很轻易地得到所有图片。
分析地址
- 分析图片地址,然后如果一般情况,写个循环就能开爬了,但这次我们用递归的方法。详细介绍见代码。
码代码
getPage(Name,a,b)
- Name:漫画名字。
- a:从a话开始。
- b:到b话截至。
def getPage(Name,a,b):
for Hua in range(a,b+1):
if recursiveDownload(Name,Hua,1):
print("第"+str(Hua)+"话下载完毕。")
recursiveDownload(Name,Hua,page)
- 函数用处:递归得到本话的所有页,递归终止条件:访问失败(没有下一页了)。
- 参数说明:
- Name:漫画名字。
- Hua:第几话。
- page:第几页。
def recursiveDownload(Name,Hua,page):
Url = re.sub("漫画名字", Name, MyUrl)
Url = re.sub("多少话", str(Hua) + "话", Url)
Url = re.sub("#", str(page), Url)
if download(Name, Url, Hua, page):
recursiveDownload(Name,Hua,page+1)
else:
return True
download(Name, Url, Hua, page)
- 函数说明:将获取到的漫画页下载到电脑上。
- 参数说明:
- Name:漫画名字。
- Url:页面地址。
- Hua:第几话。
- page:第几页。
def download(Name, Url, Hua, page):
response = requests.get(Url, headers=mHeaders)
if response.status_code == 200:
if os.path.exists("G:\\漫画\\" + Name + "\\" + str(Hua)):
open("G:\\漫画\\" + Name + "\\" + str(Hua) + "\\" + str(page) + ".jpg", 'wb').write(response.content)
print(str(Hua) + "\\" + str(page) + ".jpg" + "下载完成!")
else:
os.mkdir("G:\\漫画\\" + Name + "\\" + str(Hua))
open("G:\\漫画\\" + Name + "\\" + str(Hua) + "\\" + str(page) + ".jpg", 'wb').write(response.content)
print(Name + "第" + str(Hua) + "话\\" + str(page) + ".jpg" + "下载完成!")
return True
else:
print("连接错误!")
return False
全部代码
"""
主题:网页爬虫下载偷星九月天全部漫画。
时间:2020/10/1 —— 入手新键盘后的第一个项目
作者:Nero
"""
import requests
import os
import time
import re
MyUrl = "https://xxx.xxx.com/comic/D/漫画名字/多少话/#.jpg-kmh.middle"
mHeaders = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0'
}
def getPage(Name,a,b):
for Hua in range(a,b+1):
if recursiveDownload(Name,Hua,1):
print("第"+str(Hua)+"话下载完毕。")
def recursiveDownload(Name,Hua,page):
Url = re.sub("漫画名字", Name, MyUrl)
Url = re.sub("多少话", str(Hua) + "话", Url)
Url = re.sub("#", str(page), Url)
if download(Name, Url, Hua, page):
recursiveDownload(Name,Hua,page+1)
else:
return True
def download(Name, Url, Hua, page):
response = requests.get(Url, headers=mHeaders)
if response.status_code == 200:
if os.path.exists("G:\\漫画\\" + Name + "\\" + str(Hua)):
open("G:\\漫画\\" + Name + "\\" + str(Hua) + "\\" + str(page) + ".jpg", 'wb').write(response.content)
print(str(Hua) + "\\" + str(page) + ".jpg" + "下载完成!")
else:
os.mkdir("G:\\漫画\\" + Name + "\\" + str(Hua))
open("G:\\漫画\\" + Name + "\\" + str(Hua) + "\\" + str(page) + ".jpg", 'wb').write(response.content)
print(Name + "第" + str(Hua) + "话\\" + str(page) + ".jpg" + "下载完成!")
return True
else:
print("连接错误!")
return False
if __name__ == '__main__':
getPage("偷星九月天",1,459)
后记
- 注意爬取的时候,先查询该网站的robots.txt,看其是否允许爬取,如并在允许范围内进行爬取。
- 网址已隐藏,私聊可获取。
- 转载请注明出处。