
今天用到是python的第三方库: requests
requests这个第三方库一般的使用方法已经在前面的文章《python-爬虫初战》中讲到,今天这篇呢,在requests的基础上加入其他库的支持,相当于实战,在此做个记录。
使用工具:requests,random,xpinyin,os,json,lxml
环境准备:
- 搭建python开发环境
- 安装外部包,cmd下运行下面的命令
pip install requests
pip install random
pip install xpinyin
pip install lxml
os 和 json 是python自带的库,就不需要 pip 安装了
源码讲解环节
好的,下面就是喜闻乐见的源码讲解环节了(´◔౪◔)
1、由于这次爬取的网页的特殊,其网页目录路径的一部分是由漫画名称的拼音构成,这里导入xpinyin模块,对中文进行拼音的转换。
# 中文转拼音模块
def Chinaese_to_Pinyin(string):
pin = Pinyin()
#默认分割符为-,后接splitter='',修改为无分割符
pinyin = pin.get_pinyin(string,splitter='')
return pinyin
2、txt是自己编写的一个方法,根据输入的start_str、end字段,返回在两字段之间的字符串。
# txt是自己编写的一个方法,根据输入的start_str、end字段,返回在两字段之间的字符串
def txt(start_str, end, string): #头,尾,字符串
start = string.find(start_str)
if start >= 0:
start += len(start_str)
end = string.find(end, start)
if end >= 0:
return string[start:end].strip()
3、在user-agent池中随机获取一个User-Agent。
# 在user-agent池中随机获取一个
def random_header():
user_agent_list = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
]
return {'User-Agent': random.choice(user_agent_list)}
4、下面的就是这次爬虫的核心代码,在同一个网站下,修改name的属性就可以获取其他漫画了。另外,这次的代码中,也整理了两种etree解析的方法(文件解析、代码解析),使用了第二种能大幅节省代码量。这次的网页中需要用到把 "[1,2,3]" 这种字符串字段,转换为列表类型,这里也是搜寻了一下资源,得出了使用json.loads()这个方便快捷的方法。
# 输入想看的漫画的名称
# name = input('请输入需要爬取的漫画的名称: ')
name='我独自盗墓'
# 构造网页url,也是这个网页的特殊性,目录路径用的是漫画名称的拼音,所以这里导入xpinyin库进行转换
# https://www.gufengmh8.com/manhua/woduzidaomu/1302410.html
url = 'https://www.gufengmh8.com/manhua/'+Chinaese_to_Pinyin(name)+'/'
# 调用函数,获取User-Agent
header = random_header()
r = requests.get(url, headers=header).text
# way1 ------
# # 将源代码写入文件
# with open('index.html','w',encoding='utf-8')as f:
# f.write(r)
# # 使用etree中的xpath解析源代码,找到图片url
# parser = etree.HTMLParser(encoding="utf-8")
# tree_1 = etree.parse('index.html',parser=parser)
# way2 ------
# 直接将HTML代码丢给etree解析
tree_2 = etree.HTML(r)
# 获取各章节链接
url_list = tree_2.xpath("//ul[@id='chapter-list-54']/li/a/@href")
# 例如: '/manhua/woduzidaomu/1302408.html'
# 构造完整的章节url
uurl_list=[]
for i in range(len(url_list)):
# rfind与find函数类似,但不同的为后向前匹配,遇到第一个匹配项则返回索引值
n = url_list[i].rfind('/')
uurl_list.append(url+url_list[i][n+1:])
# 例如: 'https://www.gufengmh8.com/manhua/woduzidaomu/1302408.html'
# 获取章节的title
url_title = tree_2.xpath("//ul[@id='chapter-list-54']/li/a/span/text()")
# 例如: '002 话到起点'
# 分别获取各章节的图片
for i in range(len(uurl_list)):
r = requests.get(uurl_list[i], headers=header).text
# txt是自己编写的一个方法,根据输入的start_str、end字段,返回在两字段之间的字符串
file_url_head = 'https://res.xiaoqinre.com/' + txt(r'var chapterPath = "', r'";', r)
file_url_list = txt(r'var chapterImages = ', r';', r)
# print(type(file_url_list)) 这里file_url_list为str,需要转化为list
# 使用json模块的loads方法将str类型的list 转化为list类型
file_url_list = json.loads(file_url_list)
# 导入os模块,判断文件夹是否存在,不存在则创建文件夹
if not os.path.exists('{}\\{}'.format(name, url_title[i])):
os.makedirs('{}\\{}'.format(name, url_title[i]))
for j in range(len(file_url_list)):
url = file_url_head + file_url_list[j]
r = requests.get(url, headers=header).content
with open('{}\\{}\\{}.jpg'.format(name,url_title[i],j), 'wb')as f:
print('正在下载 《{}》 的第{}张图片!!!'.format(url_title[i],j+1))
f.write(r)
3、效果展示


舒服೭(˵¯̴͒ꇴ¯̴͒˵)౨

网友评论