递归爬漫画

前言

  • 好吧,我摊牌,写本篇文章的目的是为了蹭1024的徽章。虽然这样说,但读者依旧可以从中学到一些知识,比如,递归在爬虫中的应用,递归是编程中非常重要的内容,很多算法都离不开递归,本篇文章将为你讲解以递归代替循环来实现爬取漫画的所有章节,文章结尾附上全部代码。

需求

  • 偶然想起初中爱看的一本漫画,名字叫做《偷星九月天》,当初真的是对这本漫画爱不释手,每天都期盼着更新。多年后的今天,想用代码爬下来所有章节重刷第n遍。
  • 功能要求:能够将一本漫画的所有章节下载下来,并将每个章节分开存放在不同文件夹。
  • 拓展要求:输入漫画名字,第几话到第几话自动下载所有页面。

找资源

找到符合爬虫要求的漫画网

  • 比如某些网站它的图片存放地址为https://xxx.xxx.xxx/偷星九月天/1.jpg ,那我们就可以很轻易地得到所有图片。

分析地址

  • 分析图片地址,然后如果一般情况,写个循环就能开爬了,但这次我们用递归的方法。详细介绍见代码。

码代码

getPage(Name,a,b)

  • 函数用处:得到所有话。
  • 参数说明:
  1. Name:漫画名字。
  2. a:从a话开始。
  3. 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)

  • 函数用处:递归得到本话的所有页,递归终止条件:访问失败(没有下一页了)。
  • 参数说明:
  1. Name:漫画名字。
  2. Hua:第几话。
  3. 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)

  • 函数说明:将获取到的漫画页下载到电脑上。
  • 参数说明:
  1. Name:漫画名字。
  2. Url:页面地址。
  3. Hua:第几话。
  4. 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

全部代码

# encoding=utf8
"""
主题:网页爬虫下载偷星九月天全部漫画。
时间: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'
}

# 函数用处:得到所有话。参数说明: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)+"话下载完毕。")

# 函数用处:递归得到本话的所有页,递归终止条件:访问失败(没有下一页了)。
# 参数说明: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

# 函数说明:将获取到的漫画页下载到电脑上。
# 参数说明: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


if __name__ == '__main__':
    getPage("偷星九月天",1,459)

后记

  • 注意爬取的时候,先查询该网站的robots.txt,看其是否允许爬取,如并在允许范围内进行爬取。
  • 网址已隐藏,私聊可获取。
  • 转载请注明出处。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值