前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >网络爬虫爬取三国演义所有章节的标题和内容(BeautifulSoup解析)

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

作者头像
兰舟千帆
发布2022-07-16 12:29:40
7230
发布2022-07-16 12:29:40
举报
文章被收录于专栏:兰舟千帆的java学习笔记
在这里插入图片描述
在这里插入图片描述

前言:

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

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

正文:

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

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

环境要求: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是需要拼接的。

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

代码语言:javascript
复制
// 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协议

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档