美文网首页
[日更挑战-第五弹]python-爬取漫画图片

[日更挑战-第五弹]python-爬取漫画图片

作者: 小明阿婆 | 来源:发表于2020-05-21 22:00 被阅读0次



今天用到是python的第三方库: requests

requests这个第三方库一般的使用方法已经在前面的文章《python-爬虫初战》中讲到,今天这篇呢,在requests的基础上加入其他库的支持,相当于实战,在此做个记录。

使用工具:requests,random,xpinyin,os,json,lxml



环境准备:


  1. 搭建python开发环境
  2. 安装外部包,cmd下运行下面的命令
pip install requests
pip install random
pip install xpinyin
pip install lxml

osjson 是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、效果展示



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





相关文章

网友评论

      本文标题:[日更挑战-第五弹]python-爬取漫画图片

      本文链接:https://www.haomeiwen.com/subject/jzfxahtx.html