四、熟悉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>标签中。
上代码:
获取图片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
如果觉得能帮到您的话,请给我一颗小星星,谢谢!!!