Python3爬虫(四):用BeatifulSoup4爬取小说网站

Author:baiyucraft

BLog: baiyucraft’s Home

IDE:PyCharm


一、BeatifulSoup4的安装及简略

1.安装BeautifulSoup4

  BeautifulSoup4也是Python的第三方库,所以需要安装,同样也有两种方法

  1)使用命令行通过pip安装:

$ pip install beautifulsoup4

  2)使用Pycharm来安装,同样是之前的方法,这里不多说

2.引用BeautifulSouop4

  主要用的是BeautifulSoup类

from bs4 import BeautifulSoup

  或者也可以直接导入

import bs4
3.使用BeautifulSoup4

  要使用这个库,需要对html语言有点了解,需要了解标签的概念,如果有不懂的可以去看我的html教程

  具体详细使用方法可以看文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

  BeautifulSoup4的使用是对于html文档的:

# rs是用requests库请求返回的对象
# rs.text返回的是该请求的内容
bs = BeautifulSoup.(rs.text)
# 在高版本的Python中,一般不需要加解析器

  在了解了html标签的特性后,一般才用两种方式来遍历查找自己想要的内容

  1) 采取find_all()方法

# 查找标签名叫p的所有标签
# 返回:[<p>内容</p>]
bs.find_all('p')
# 查找标签名叫p的标签,属性class值为‘article’的标签
# [<p class = "article">内容1</p>,<p class = "article">内容2</p>]
bs.find_all('p', class_ = "article")

  2)用CSS选择器搜索

# 查找标签名叫p的所有标签
# 返回:[<p>内容</p>]
bs.select('p')
# 查找所有类为article的标签
bs.select('.article')
# 查找有href属性的a标签
bs.select('a[href]')

  有了这些最最基础的基础,我们就可以爬取我们小说网站的整本小说了

二、爬取小说网站的过程

  这里爬取的是顶点小说网,这是爬取书的网址:http://www.dingdiansk.com/book/5.html

  打开网址,我们知道,每个章节目录对应的是一个该章节的网址:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JC2ipYpi-1621490044196)("https://cdn.jsdelivr.net/gh/baiyucraft/baiyuBlogImg/img/2021-05-20/1302a5d250.png)]

  我们点击第一章,右键审查元素,可以发现我们的链接是在<a>标签中的:

  但是,一个html网页中有好多<a>标签,这个没有什么标识性,我们将目标瞄准在这个<a>标签的父级标签,class = "dccss"的<div>标签,代码如下:

# bs为返回的网页内容的html文档
# 用find_all()方法
chaper_d = bs.find_all(class_ = "dccss")
chaper_a = []
	for chaper_d in chaper_d_list:
	chaper_a.append(chaper_d.find_all('a'))
# 用css选择器搜索
chaper_a = bs.select('.dccss > a')

  两种方法效果一样,都能得到我们的章节列表的<a>标签:

  我们对遍历所有的<a>标签,取出其中的章节链接和章节名:

chaper_l = []
# 遍历<a>标签,取出其中的href属性的内容和标签的文本内容
for chaper in chaper_a:
	chaper_l.append([chaper["href"],chaper.string])

  接下来我们需要对一个章节中的文本内容进行爬取,我们分析第一章的html内容:

  发现所有的文本内容都在id = “content”的<div>标签内,我们需要获取<div>标签中所有的文本内容,代码如下:

# bs为获取到的第一章的html内容# 筛选id = “content”的<div\>标签cont = bs.select('#content')# 获得该标签中的文本内容chaper_text = cont[0].get_text()

  这样我们第一章的文本内容就全部被获取了,是不是so easy!

  下一步就是完善代码,写入文件以及添加交互,最终封装成类:

# -*- coding: UTF-8 -*-import requestsfrom bs4 import BeautifulSoup50import osclass Novel():    # 初始化类    def __init__(self):        self.header = {            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36',            }        self.url = "http://www.dingdiansk.com"        self.novel_path = 'novel'        self.novel_id = input("请输入小说的序号:")        self.book_url = self.url + "/book/" + self.novel_id + ".html"        # 封装个获取网页html信息的函数    def get_html(self, url):        rs = requests.get(url, headers=self.header)        rs.encoding = "utf-8"        bs = BeautifulSoup(rs.text,"html5lib")        return bs        # 获取章节列表    def get_chaper(self):        # 用css选择器搜索        chaper_a = self.get_html(self.book_url).select(".dccss > a")        self.chaper_l = []        for chaper in chaper_a:            self.chaper_l.append([chaper["href"],chaper.string])        # 获取小说名字    def get_title(self):        self.novel_title = self.get_html(self.book_url).select('meta[property="og:novel:book_name"]')[0]["content"]        print("正在下载小说:《"+self.novel_title+"》...")        #下载小说    def downlaodChaper(self):        if not os.path.exists(self.novel_path):            os.mkdir(self.novel_path)        with open(self.novel_path + '/' + self.novel_title + ".txt", 'w', encoding="utf-8") as f:            for chaper in self.chaper_l:                cont = self.get_html(self.url+chaper[0]).select("#content")                print("正在下载 "+chaper[1])                chaper_text = cont[0].get_text()                f.write(chaper[1]+'\n')                f.write(chaper_text+'\n')        f.close()if __name__ == "__main__":    n = Novel()    n.get_chaper()    n.get_title()    n.downlaodChaper()

  这样我们就可以自己通过爬虫来下载小说了!

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值