爬虫入门—数据解析基础 bs4库使用之红楼梦全文文本爬取
Author: Labyrinthine Leo
Init_time: 2021.02.23
Key Words: Spider
、BeautifulSoup
公众号:Leo的博客城堡
欢迎各位读者关注公众号:Leo的博客城堡
,如有任何问题,可以私聊博主!
1、需求分析
需求:在上一节中,我们大概了解BeautifulSoup
库的基本使用,这一节我们将使用bs4
库进行实战,对诗词名句网的红楼梦小说文本内容进行爬取,包括每一章的标题和内容,并将所有内容保存到本地文本文件中。
分析:
- 首先,我们通过
https://www.shicimingju.com/book/hongloumeng.html
进入诗词名句网的红楼梦小说主页,如下图所示。其中包含每一章的标题信息,同时我们需要每个章节对应的内容。查看页面源码,会发现,每一个标题标签对应着一个url
链接,这样我们只需对此页面内所有章节的链接提取即可获得每一个章节对应的页面。
- 打开对应链接,发现章节内容即在源码中,我们对对应标签的文本信息进行提取即可。
- 打开开发者模式,可以发现每一个章节对应的
url
其实就是索引号不同,很方便即可获取。
-
关键点在于使用
bs4
库对每个章节的对应链接进行提取,并访问对应页面,对页面中的章节内容进行提取即可。 -
基础的流程已经分析清楚,接下来便可动手编码了。
2、编码
# coding : utf-8
# fun : 爬取红楼梦小说所有的章节标题和章节内容 https://www.shicimingju.com/book/hongloumeng.html
# @Author : Labyrinthine Leo
# @Time : 2021.02.01
import requests
import json
from bs4 import BeautifulSoup
def book_spider(url):
"""
爬取红楼梦文本信息
:param url: 网站url
:return:
"""
# 1.指定url
url = url
# 2.UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
# 3.发送请求&获取响应数据
page_text = requests.get(url=url, headers=headers)
page_text.encoding = page_text.apparent_encoding # 获取编码
page_text = page_text.text
# 4.对text页面进行章节标题文本提取并获取每个章节对应的url链接
soup = BeautifulSoup(page_text, 'lxml')
aTagList = soup.select('.book-mulu li > a') # 获取a标签信息
titleList = [i.text for i in aTagList] # 获取a标签中的文本信息
urlList = [i["href"] for i in aTagList] # 获取s标签中每个章节的url
# 5.保存章节内容
with open('./红楼梦.txt', 'w', encoding='utf-8') as fp:
fp.write("红楼梦\n") # 写入标题
for chp in zip(titleList, urlList):
write_chapter(chp)
print("已成功下载红楼梦全文!")
def write_chapter(content_list):
"""
将每章节信息提取并写入txt文本
:param content_list:
:return:
"""
# 获取标题和链接
title, url = content_list
intact_url = "https://www.shicimingju.com" + url
# UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
# 发送请求&获取响应信息
page_text = requests.get(url=intact_url, headers=headers, timeout=10)
page_text.encoding = page_text.apparent_encoding # 获取编码
page_text = page_text.text
# 构建soup对象进行解析文本
soup = BeautifulSoup(page_text,'lxml')
content = soup.select('.chapter_content')
txt = "" # 构建文本字符串
for i in content:
txt += i.text
# 持久化存储
with open('./红楼梦.txt', 'a', encoding='utf-8') as fp:
fp.write(title+'\n') # 写入标题
fp.write(txt+'\n') # 写入章节内容
# print("已成功下载{}内容".format(title.split('·')[0]))
print("已成功下载内容:{}".format(title))
if __name__ == '__main__':
# 指定url
url = "https://www.shicimingju.com/book/hongloumeng.html"
# 爬取文本信息
book_spider(url)
运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mh80EDD7-1614090048751)(https://cdn.jsdelivr.net/gh/LabyrinthineLeo/CloudImgs@master/data/红楼梦文本_06.png)]
同时,博主将其全文内容保存到txt
文本中:
临渊羡鱼不如退而结网
创作不易,如果您觉得这篇文章对你有用,可以点个赞,算是对笔者的支持和激励!这里是Leo的博客城堡,以Python为核,ML&DL为主,泛之形形色色,输寥寥拙见,摄浮光掠影,讲三两故事。临渊羡鱼,不如退而结网,持续干货输出,有趣的灵魂值得你的关注!
原文可以去笔者的github
主页:https://github.com/LabyrinthineLeo/Yxs_Git_Learning_repos
查看(如果可以,点个star
也无妨呀,嘿嘿)。