大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
=
‘http://www.svmhz.com/shaonvmanhua/list_4_%s.html’
% offset
http://www.svmhz.com/shaonvmanhua/9894.html
parser_img_src(html)讲解
——————————-
= soup.find
(
‘ul’,
{
‘class’
:
‘mnlt’
}
)
= img_span.find_all
(
‘img’,
src
=re.compile
(
‘^http://tu.goldlevi.com/svmhz/uploads2/allimg/[0-9]{1,}/(.*?).jpg$’
))
parser_img_src(html)讲解结束
—————————
down_image(url, title, titles)
——————————-
save_image函数进行下载,本函数还进行请求,判断请求是否会超时
down_image(url, title, titles)讲解结束
——————————-
=
‘D:/pic/’
+
str
(title
)
#确定保存在哪个文件夹下面
if not os.path.exists
(path
)
:
#如果文件夹不存在,就进行保存
#-*- coding: utf-8 -*-#-*- coding: utf-8 -*-
from requests.exceptions import RequestException
from bs4 import BeautifulSoup
from multiprocessing import Pool
from lxml import etree
import requests, os, re
def get_index_page(offset):#√
url = 'http://www.svmhz.com/shaonvmanhua/list_4_%s.html' % offset#offset是形参,用来传给s
try:
response = requests.get(url)
response.encoding = response.apparent_encoding
if response.status_code == 200:
return response.text
print('链接返回出现异常')
return None
except RequestException:
print('爬虫出现异常')
return None
def parser_index_page(html):#√该函数是为了找到漫画对应的连接在什么地方
soup = BeautifulSoup(html, 'lxml')
listcon_tag = soup.find('ul', class_='listcon')#属性为listcon的列表
#在源码中被ui包起来的部分,也就是找到被ul包围起来的列表
if listcon_tag:
url_list = listcon_tag.find_all('a', attrs={'href': True})#找到所有的修正部分
#print("url_list",url_list)
if url_list:
urls = ['http://www.svmhz.com' + url['href'] for url in url_list]#遍历子网页的子网页,遍历干净为止。
return urls#获得各个漫画本的入口的集合,例如http://www.svmhz.com/shaonvmanhua/9642.html
def get_image_page(url, total):#√该函数是为了获取所有子网页的集合
list_url = []#python的列表创建
list_url.append(url)
#print("################")
#print("url = ",url)
#print("################")
#print("total = ",total)
url = url.split('.html', 2)[0]#把这个url以.html为标记切割2次,切割结果中取第一个
for i in range(2,total+1):#total+1是取不到的
urls = url + '_' + str(i) + '.html'#ulrs举例:http://www.svmhz.com/shaonvmanhua/6952_165.html,这个已经是具体到了某特定漫画书的具体某一页了
list_url.append(urls)
return list_url#这个函数之所以这么处理,并且序号从2开始,是因为漫画打开后的第一页是没有页码的,页数从每本漫画的第2页才开始
def parser_image_page(url):#获取带有总页数信息的字符串
try:
response = requests.get(url)
response.encoding = response.apparent_encoding
if response.status_code == 200:
html = response.text
htmls = etree.HTML(html)#提取页面数据
total = htmls.xpath('//*[@id="mh_content"]/div[@class="dede_pages_all"]/div/ul/li[1]/a/text()')[0]#右键复制网页源码中的Xpath,然后粘贴
if total:
return total#这里返回的信息举例:“本漫画共69页”
print('链接异常')
return None
except RequestException:
print('爬虫异常')
return None
def get_image_src(url):
#print("此处的url",url)#举例:http://www.svmhz.com/shaonvmanhua/9370_4.html
try:
response = requests.get(url)
print("response",response)
response.encoding = response.apparent_encoding
if response.status_code == 200:
return response.text
print('链接异常')
return None
except RequestException:
print('爬虫异常')
return None
def parser_img_src(html):#这里html是网页源码
soup = BeautifulSoup(html, 'lxml')#soup是beautifulsoup解析过的html
titles = soup.select('title')[0].get_text()#有可能会有其他的title,但是不需要,这里指需要第一个,
#print("这里分割:", titles)#日本漫画】色列本子之[U.R.C] 慧ちゃん限定(2)_少女漫画站,(2)是页码
title_page = titles.split('_', 2)[0]#titles是创立图片时需要使用的名字,title是创立文件夹需要的名字
#print("title_page=",title_page)
title = title_page.split('(', 2)[0]#保留(左边的部分
#print("title=", title)
img_span = soup.find('ul', {'class': 'mnlt'})
if img_span:
img_src = img_span.find_all('img', src=re.compile('^http://tu.goldlevi.com/svmhz/uploads2/allimg/[0-9]{1,}/(.*?).jpg$'))
if img_src:
for url in img_src:
urls = url['src']
down_image(urls, title, titles)#调用了down_image函数
def down_image(url, title, titles):#根据入口链接对漫画进行下载
#url = http: // tu.goldlevi.com / svmhz / uploads2 / allimg / 161129 / 2 - 161129102620.j
#title = 莲子酱绅士福利本 动漫本子邪恶少女漫画
#titles = 莲子酱绅士福利本 动漫本子邪恶少女漫画_少女漫画站
try:
response = requests.get(url)
if response.status_code == 200:
save_image(response.content, title, url, titles)#调用函数进行对图片的保存
print('链接异常')
return None
except RequestException:
print('爬虫异常')
return None
def save_image(content, title, url, titles):
path = 'D:/pic/' + str(title)#确定保存在哪个文件夹下面
if not os.path.exists(path):#如果文件夹不存在,就进行保存
os.mkdir(path)
file_name = '{0}/{1}.{2}'.format(path, titles, '.jpg')#{1}.{2}中{1}是名字,{2}是后缀,{0}是文件夹路径
#print("file_name=",file_name)
if not os.path.exists(file_name):#如果以该文件为名义的文件不存在
with open(file_name, 'wb') as f:#读写建立一个新的二进制文件
f.write(content)
print('保存漫画成功', title, url)
f.close()
def main(offset):
html = get_index_page(offset)#html初始化
for url in parser_index_page(html):#这里的html是按了F12之后出现的网页源代码,in后面是深层次便利后的 子网页连接的集合
html = parser_image_page(url)#html代表总页码相关的字符串,例如“本漫画共有89页”
total = int(re.compile('(\d+)').search(html).group(1))#从带有总页码信息的文字字符串中提取出纯数字信息,提取后结果为:89
for img_url in get_image_page(url, total):#传入参数,url=某本特定的漫画书入口网址,total:该漫画书页码,该句对哪本漫画书中的第几页进行了精确的确定
#该函数返回该特定的漫画书中各个页码对应的连接的集合****
htmls = get_image_src(img_url)#get_image_src是获取url并且在函数里面调用下载函数
parser_img_src(htmls)
##两重for循环的话
##第一个for循环把某个特定漫画的总页码数total和该特定漫画在首页的入口url递给第二个for循环
##那么有一重是负责遍历首页的各种连接的
##有一重是用来遍历该连接中的各种子连接的
##第二个for循环是用来遍历某个特定漫画的各个页并进行下载的
##第一个for是用来遍历首页推荐的各种漫画的
if __name__ == '__main__':
groups = [x for x in range(1, 86)]#爬http://www.svmhz.com/shaonvmanhua/的一部分,总共有85页
pool = Pool()
pool.map(main, groups)#
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/172254.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...