从0开始的爬虫(6)

四、熟悉selenium ----sf漫画网
https://manhua.sfacg.com/

sf漫画网是一个免登录免费的漫画小说网站,它其中的漫画专栏是用JavaScript动态渲染,所以我们可以使用selenium模块爬取它的漫画。大家看到JavaScript不要紧张,在这个网站中它并不是全部有JavaScript编写,只是在H5中嵌入有部分JavaScript语句,分析我们还是跟之前的过程相同。

以漫画《萌师在上》https://manhua.sfacg.com/mh/MSZS/ 这个网址为例,首先获取该漫画更新到当前共有多少话,再获取到每一话的url,我们可以知道集数再

,具体每一话在 第**话

在转跳到具体某一话,如第二十六话
https://manhua.sfacg.com/mh/MSZS/36300/,
首先找到该话的具体共有多少张图片,再获取每张图片的url,找到下一页的JavaScript语句,并在得到当前图片url后,模拟点击获取下一页,依次循环,至获取玩全部。

获取图片总数有两种方式:
1、<option … …>标签,在源代码中这个标签只出现过一次,可以直接搜索到。
2、在标签

中,搜索不便捷。
获取图片url:
在标签<… … id = “curPic”>中
获取下一页JavaScript标签:
1、 在<div … id = “AD_j1”><a><a><a><a …>中,标签为id = “AD_j1”中的第四个<a>标签。
2、 在<div … class = “page_turning”><a><a><a …>中,标签为class = “page_turning”中的第三个<a>标签中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上代码:

from selenium import webdriver
import requests
import os
Dirnum = 0
def VisitDir(path):
    global Dirnum   #global类型,定义Dirnum为全局变量
    for list in os.listdir(path):
        SubPath = os.path.join(path,list)
        if os.path.isdir(SubPath):
            Dirnum = Dirnum + 1
            VisitDir(SubPath)
    return Dirnum - 1
#使用递归函数,遍历path路径下的文件夹数量并返回
#作用:当终止程序后再次运行时,爬取相同的漫画会紧接上次爬取的某一话
def mkDir(path):
    if not os.path.exists(path):
        os.mkdir(path)
#检测文件夹是否存在
def savePicture(filename,url):
    with open(filename,'wb') as f:
        f.write(requests.get(url).content)
#保存图片
def getUrl(indexUrl):
    pictureUrl = []
    browser = webdriver.Chrome()
    browser.get(indexUrl)
    browser.implicitly_wait(3) #等待3秒
    title = browser.title.split(',')[0]  #获取漫画名
    mkDir(title)
    #找到该漫画每一集的url
    for comicList in browser.find_elements_by_class_name('comic_Serial_list'):
        Urls = comicList.find_elements_by_tag_name('a')
        for Url in Urls:
            pictureUrl.append(Url.get_attribute('href'))
        # 获得每集url
    browser.quit()
    Comics = dict(name = title,urls = pictureUrl)
    return Comics
#获取该漫画的名字和更新到当前集的所有url
def getPictureUrl(Comics):
    EpisodeUrls = Comics['urls']
    title = Comics['name']
    temp = VisitDir(title)
    NewEpisodeUrls = []
    while temp < len(EpisodeUrls):
        NewEpisodeUrls.append(EpisodeUrls[temp])
        temp = temp + 1
    #检测之前爬取该漫画的集数,筛选漫画每一集的url,紧接之前的工作继续爬取
    for url in NewEpisodeUrls:
        browser = webdriver.Chrome()
        browser.get(url)
        browser.implicitly_wait(5)
        mkDir(title+"/"+browser.title.split("-")[1])
        #获取漫画具体的哪一集,并创建文件夹
        pageNum = len(browser.find_elements_by_tag_name('option'))
        #获取漫画某一话具体的图片页数
        nextpage = browser.find_element_by_xpath('//*[@id="AD_j1"]/div/a[4]')#新的搜索标签的方法,在后文有详细介绍
        #找到H5中的下一页,Javascript的语法
        for tempNum in range(pageNum):
            PictureUrl = browser.find_element_by_id('curPic').get_attribute('src')
            filename = title+"/"+browser.title.split("-")[1]+"/"+str(tempNum)+'.png'
            savePicture(filename,PictureUrl)
            nextpage.click()
        print("当前章节\t{}  下载完毕".format(browser.title))
        browser.quit()
#获取每一集中具体每一页漫画的url,并调用savePicture()函数保存
def Main():
    url = input("输入漫画首地址:")
    getPictureUrl(getUrl(url))
if __name__ == "__main__":
    Main()

结果:
在这里插入图片描述

大家可以到我的github上查看源代码:
https://github.com/ficherfisher/picture/tree/Crawl
如果觉得能帮到您的话,请给我一颗小星星,谢谢!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值