Python爬虫从入门到放弃 07 | Python爬虫实战--下载盗墓笔记全集

此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。
本文章纯野生,无任何借鉴他人文章及抄袭等。坚持原创!!

前言

你好。这里是Python爬虫从入门到放弃系列文章。我是SunriseCai。


本文章主要介绍利用爬虫程序下载 南派三叔的 盗墓笔记 小说全集。

盗墓笔记全集地址:http://www.daomubiji.com/

1. 文章思路

看看盗墓笔记小说网站,如下图所示:

  • 首页(一级页面)
    在这里插入图片描述
    在这里插入图片描述
  • 章节页面(二级页面)
    在这里插入图片描述
  • 正文页面(三级页面)
    在这里插入图片描述

通过上面几张图片可以看出,这一套下来就是个俄罗斯套娃!!!

  1. 访问 首页(一级页面) 获取 二级页面
  2. 访问 章节页面(二级页面) 获取 正文页面(三级页面)
  3. 访问 正文页面(三级页面),提取正文数据。
  4. 保存正文 数据。

在这里插入图片描述
接下来看看如何实现请求这些网页。

2. 请求 + 分析 网页

通过上边可知道,盗墓笔记小说网站的首页为:http://www.daomubiji.com/

2.1 访问首页(一级页面)

浏览器打开 盗墓笔记 的首页,点击F12,进入开发者模式。看看页面结构,发现了二级页面的链接。perfect !!!那接下来就是 请求网页 以及 解析网页提取数据)了。
在这里插入图片描述

  • 代码实现 访问首页 获取 二级页面 链接
  • 这里使用前面文章介绍过的requests请求网页 及XPath模块去 解析网页
import requests
from lxml import etree

url = 'http://www.daomubiji.com'

def get_overview():
	# 访问盗墓笔记首页
    res = requests.get(url)
    # 如果访问状态码为200(即成功)就继续
    if res.status_code == 200:
    	# 构造XPath解析对象
        parse_html = etree.HTML(res.text)
        link = parse_html.xpath('//*[@id="menu-item-1404"]/ul/li/a/@href')	# 二级页面链接
        name = parse_html.xpath('//*[@id="menu-item-1404"]/ul/li/a/text()')	# 二级页面名称
        return link, name
    else:
        print('your code is fail')

link,name = get_overview()
print(link, name)

# ['http://www.daomubiji.com/dao-mu-bi-ji-1', 'http://www.daomubiji.com/dao-mu-bi-ji-2',
 'http://www.daomubiji.com/dao-mu-bi-ji-3', 'http://www.daomubiji.com/dao-mu-bi-ji-4',
 'http://www.daomubiji.com/dao-mu-bi-ji-5', 'http://www.daomubiji.com/dao-mu-bi-ji-6',
 'http://www.daomubiji.com/dao-mu-bi-ji-7', 'http://www.daomubiji.com/dao-mu-bi-ji-8',
 'http://www.daomubiji.com/dao-mu-bi-ji-2015']
# ['盗墓笔记1:七星鲁王', '盗墓笔记2:秦岭神树', '盗墓笔记3:云顶天宫', '盗墓笔记4:蛇沼鬼城',
 '盗墓笔记5:迷海归巢', '盗墓笔记6:阴山古楼', '盗墓笔记7:邛笼石影', '盗墓笔记8:大结局',
 '盗墓笔记2015年更新']

这里已经获取到了二级页面的链接,接下来就是去访问 章节页面(二级页面) 获取 **正文页面(三级页面)**了。

2.2 访问章节页面(二级页面)

看到二级页面链接的章节目录,发现了 正文页面(三级页面),这正是我们想要的,下面用代码去实现访问 章节页面(二级页面) 获取 正文页面(三级页面)
在这里插入图片描述

def get_catalogs(url):
    """
    :param url: 传入二级页面的链接
    :return: 返回所有章节目录于标题
    """
    res = requests.get(url=url)
    if res.status_code == 200:
        parse_html = etree.HTML(res.text)
        link = parse_html.xpath('/html/body/section/div[2]/div/article/a/@href')	# 正文链接
        title = parse_html.xpath('/html/body/section/div[2]/div/article/a/text()')	# 正文标题
        return link, title
    else:
        print('your code is fail')

这里获取到正文(三级页面)的链接和标题后,接下来就是请求正文了。

2.3 访问 正文页面(三级页面),提取 + 保存正文

通过下图可以发现,正文的内容都藏在article标签下面,那接下来尝试去请求该页面。
在这里插入图片描述

  • 正文提取代码示例:
def get_content(url,title):
    """
    :param url: 传入正文链接
    :return: 返回正文内容
    """
    res = requests.get(url=url)
    if res.status_code == 200:
        parse_html = etree.HTML(res.text)
        content = parse_html.xpath("/html/body/section/div[1]/div/article/p/text()") # 正文内容
        return title, content
    else:
        print('your code is fail')

get_content(url)
  • 正文保存代码示例:
def save_content(content, name):
    """
    :param content: 传入正文内容
    :param name:    传入标题
    :return: 
    """
    with open('%s.txt' % name, 'a', newline='') as f:
        for data in content:
            f.write(data+'/n')	# 加一个换行,段落间需要换行
        f.close()

3. 完整代码

  • 这里针对上边的代码做了整合和部分修改
  • 代码直接拷贝即可运行
# -*- coding: utf-8 -*-
# @Time    : 2020/1/25 20:20
# @Author  : SunriseCai
# @File    : DaoMBJSpider.py
# @Software: PyCharm


"""盗墓笔记爬虫程序"""


import os
import requests
from lxml import etree


class DaomubijiSpider(object):
    def __init__(self):
        self.url_homePage = 'http://www.daomubiji.com'
        self.headers = {'User-Agent': 'Mozilla/5.0'}
        self.content_titles = None
        self.content_links = None

    def get_overview(self):
        """
        :return:  访问首页,获取二级页面的标题的链接
        """
        res = requests.get(self.url_homePage, headers=self.headers)
        if res.status_code == 200:
            parse_html = etree.HTML(res.text)
            links = parse_html.xpath('//*[@id="menu-item-1404"]/ul/li/a/@href')
            titles = parse_html.xpath('//*[@id="menu-item-1404"]/ul/li/a/text()')
            for link, title in zip(links, titles):
                self.get_catalogs(title, link)
                self.get_content()
        else:
            print('your code is fail')

    def get_catalogs(self, title, url):
        """
        :param title: 传入二级页面标题
        :param url:   传入二级页面链接
        :return:    将解析度到的章节目录标题和链接保存到self
        """
        if not os.path.exists(title):
            os.makedirs(title)
        res = requests.get(url=url, headers=self.headers)
        if res.status_code == 200:
            parse_html = etree.HTML(res.text)
            self.content_links = parse_html.xpath('/html/body/section/div[2]/div/article/a/@href')
            self.content_titles = [parse_html.xpath('/html/body/section/div[2]/div/article/a/text()'), title]
        else:
            print('your code is fail')

    def get_content(self):
        """
        :return:  提取正文页面的正文
        """
        folder = self.content_titles[1]
        for link, title in zip(self.content_links, self.content_titles[0]):
        	time.sleep(2)   # 休眠2秒,不能给对方服务器造成太大压力
            res = requests.get(url=link, headers=self.headers)
            if res.status_code == 200:
                parse_html = etree.HTML(res.text)
                content = parse_html.xpath("/html/body/section/div[1]/div/article/p/text()")
                self.save_content(folder, title, content)
            else:
                print('your code is fail')

    def save_content(self, folder, title, content):
        """
        :param folder: 传入文件夹
        :param title:  传入标题
        :param content: 传入正文内容
        :return: 
        """
        with open('%s/%s.txt' % (folder, title), 'a', newline='') as f:
            for data in content:
                f.write(data+'\n')
            f.close()

    def main(self):
        self.get_overview()


if __name__ == '__main__':
    spider = DaomubijiSpider()
    spider.main()

来看看成果:
在这里插入图片描述
在这里插入图片描述
至此,本文结束。


不可否认,本篇文章写的还过得去,建议各位通过复制黏贴代码去执行一番,重温南派三叔的魅力。


最后来总结一下本章的内容:

  1. 介绍了盗墓笔记网站的爬虫思路
  2. 详细讲解了如何利用爬虫程序下载全网小说
  3. 已经很详细了,有任何疑问欢迎在下方留言。

sunrisecai

  • 感谢你的耐心观看,点关注,不迷路。
  • 为方便菜鸡互啄,欢迎加入QQ群组织:648696280

下一篇文章,名为 《Python爬虫从入门到放弃 08 | Python爬虫实战–下载某图片网–待定》

发布了42 篇原创文章 · 获赞 310 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/weixin_45081575/article/details/104081694
今日推荐