网络爬虫爬取三国演义所有章节的标题和内容(BeautifulSoup解析)

在这里插入图片描述
前言:

三国演义是我比较喜欢的小说了,记得袁阔成老先生说,《三国演义》是那段历史的一座人才宝库,也是一部活的兵书,是一座军事大课堂。从小喜欢读三国演义,常常为作者的文笔而惊叹。在这本书里,我们看见了过往的,看到了历史璀璨的文化积淀,同时我们也获取到了心灵的养分。

很清楚的很深刻的一种感觉就是,史学文化巨著是一种鸡汤,就算我们学会太多的技术也无法代替文话巨著对人类的影响。没有中华文化的熏陶,心灵永远是干涸的。

正文:

我坚信你我前面说到的不是废话,但我们要开始正文。

目的需求:爬取三国演义的所有章节的标题和内容。

环境要求:requests模块,BeautifulSoup(美味的汤)模块

下面我们开始行动

首先,打开一个网站,直接搜索诗词名句网。给力的是,这个网站也可以看到我喜欢点的三国演义以及各种名著。

在这里插入图片描述
我们点击古籍然后点击三国演义,因为今天我们要拿到三国演义的所有内容。

在这里插入图片描述
可以看到三国演义就在这里。我们要拿到它的标题,以及对应的内容。并没有分析是否可以自浏览器直接进行下载,但是我们采用爬虫的效率是绝对比较高的,当你要分析大量的数据时,爬虫当然是发挥着巨大的作用。而且,爬虫可以办到你在浏览器页面办不到的事情。

开始分析网页

右键检查网页源代码,我们这一次并不打算在network那里采用抓包,我们要分析网页的代码,我们要进行解析。

在这里插入图片描述
可以看到,我们在源代码那里进行区域移动,左边可以对应到相应的区域,以此,我们可以进行区域的定位。得出标题在源代码标签的位置。

在这里插入图片描述
分析可以定位到这里三国演义的每个章节的标题是对应每一个li标签的。

我们要获取li标签下面的文本内容,就是标题。我们要获取所有的li标签,那就需要匹配。毫无疑问,本章我是用BeautifulSoup来进行解析的,我要熬制一小锅美味的汤。
在这里插入图片描述
如上图,其实你打开每一个li标签,里面的文本内容,就是标题,获取标题我们用到的方法属性是 title = li.a.string,所谓li.a.string就是获取a标签的直系标签。就是如此。
但是我们需要定位,可以看到li标签在div标签,并且class="book-nulu"这里,
我们用到的属性方法就是soup.select(‘.book-mulu>ul>li’),一个点.就代表指定类,>号,代表层级关系,所以我们这样写。
另外,还有一个链接,其实对应的正文应该就在那里了。打开看看。
在这里插入图片描述
可以看到,不出所料。但其实,你会发现,在li标签看到的链接是不完整的。
比如li标签里面是 /book/sanguoyanyi/1.html,但其实当你打开这个链接时,地址栏其实是https://www.shicimingju.com/book/sanguoyanyi/1.html。所以它存在一个拼接url的过程。所以在写程序时我们也需要给它拼接一下。
在这里插入图片描述
如上图,我们会发现,正文在这里,其实也是在一个标签里面。当我们获取当这个页面的全部内用时,我们还是需要来定位获取目标文本。
soup.find(‘div’,class_ = ‘chapter_content’) 指定div标签以及属性来定位。这样我们就可以获取到正文数据。

大致的分析定位就是如此。

代码实现思路

那么如何代码实现,我们要明白,我们当然先要请求到这个主页,我们然后通过数据解析来定位到 li 标签。然后我们可以获取相应的标题,但是我们需要再次请求一下,那就是获取正文,当然正文的url是需要拼接的。

具体代码实现以及相关注释解析
下面展示一些 内联代码片

// An highlighted block
import requests
from bs4 import  BeautifulSoup
if __name__ == '__main__':
    pass
    #对首页的数据进行爬取
    headers = {
        'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
    }
    url = 'https://www.shicimingju.com/book/sanguoyanyi.html'
    page_text = requests.get(url =url,headers= headers).content
    #在首页中解析出所有章节的标题和详情页的url
    #实例化BeautifulSoup对象,需要将页面的网页源码加载到该对象中
    soup = BeautifulSoup(page_text,'lxml') #拿到了对象
    #解析章节标题和详情页的数据
    li_list = soup.select('.book-mulu>ul>li')层级表达式
    fp = open('./sanguoyanyi.text', 'w', encoding='utf-8')
    for li in li_list :
        title = li.a.string
        detail_url = 'https://www.shicimingju.com'+li.a['href']
        #对详情页发起请求,并进行解析
        detail_page_text =requests.get(url=detail_url,headers=headers).content
        #解析详情页面的内容
        detail_soup = BeautifulSoup(detail_page_text,'lxml')
        div_tag = detail_soup.find('div',class_ = 'chapter_content')
        content = div_tag.text
        fp.write(title+":"+content+'\n')
        print(title+'爬取成功')


代码很简单,但是我们需要分析一波,里面相关的语法还是需要了解,比如如何解析网页。python代码的长度并不能决定它所涉及的操作难度,以及知识范围。我们来看测试运行。
在这里插入图片描述
章节比较多,只能展示一部分,这里控制台打印出所有的已经抓取完毕。那我们打开文件来看。
在这里插入图片描述

在这里插入图片描述
以notepad++,记事本打开都可,当然,pycharm也可以。

注:page_text = requests.get(url =url,headers= headers).content
这一段代码,我们的指定content,是以二进制来获取的,如果你指定.text,可能会出现乱码,我尝试过,我们目前以二进制来获取,然后在后面指定编码。后面出现这种指定,也是同样的道理。

追加解释:关于headers已经是很熟悉了,一般是要指定User-Agent,就是模拟浏览器,但是反爬加强的,我们需要指定更多,比如cookies,甚至cstf,甚至更多,就是网站做出的反爬机制嘛。
还有保存的遍历,遍历li标签,获取一个li标签,就要得到它的标题,以及再次请求获取到正文。如此这般,就可以获取每一个标签下对应的正文。关于爬取可能的文字欠缺可能与网络速度等诸多因素有关,但是效果我们是可以达到需求的。
其他的感觉没有什么疑惑,已经很用心的讲解了哈哈哈。

相关的请遵守csdn协议

还是希望各位猿友多多指点。

点击访问主页jgdabc

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兰舟千帆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值