python的requests和bs4库爬取小说全文

昨天,数据猿爬取到了笔趣小说一个近2735章的爽文小说,整个过程较为顺利。

今天,数据猿整理了一下代码,分享给大家。

目录如下:

第0步,准备

本文运行环境:Python3.8,Pycharm;Win10系统

需要的库 :requests、bs4、re 、fake-useagent

整个爬虫的思路是

  1. 找到目标小说的所有章节链接
  2. 根据所有的章节链接,构造小说内容的网址
  3. 爬取内容并保存

第1步,分析目标网页

本文的目标网页为“https://www.xsbiquge.com/20_20331/”。

浏览器内按F12,查看该小说章节页面的html,crtl+F来查询某一章节“开启神武印记”,从而找到章节链接所在的位置。

1

可以定位到章节所在的位置在body-div-div-div-d1-dd-a标签中,所以我们用

如法炮制,我们可以确定小说内容所在的网页。

image-20200524095855698

第2步,解析页面

bs4解析章节页面

先用find_all选中dd标签,然后枚举find_all得到的列表,使用列表解析式分别选取其中的['href']链接和get_text()文本内容。得到一个元组,分别是链接和标题,用来生成每一章的内容。

# bs4解析
soup = BeautifulSoup(html, 'lxml')
all_link = [(link.a['href'],link.a.get_text()) for link in soup.find_all('dd')]
print(all_link)

得到如下元组列表

[('/20_20331/1135932.html', '第1章 八百年后'), ('/20_20331/1135933.html', '第2章 开启神武印记'), ('/20_20331/1135934.html', '第3章 黄极境')。。。。]
bs4解析内容页面

使用find方法选中div标签,Idcontent的文本内容

# bs4解析
soup = BeautifulSoup(html,'lxml')
content = soup.find('div',{'id':'content'}).get_text()
print(content)

得到每一章的小说内容

image-20200524100140721

第3步,自动化爬取

伪装浏览器响应头

这里,数据猿推荐大家使用fake_useragent库,随机生成响应头来伪装浏览器。

# 浏览器响应头
def get_ua():
    ua = UserAgent()
    return ua.random
章节→内容

看完第二步,相比有的小伙伴想问,要想实现自动爬取,肯定要程序自动通过章节链接得到每一章的小说内容,这个自动过程如何实现呢?

前面得到的元祖列表,通过切片,分别成为新的内容页面的url章节标题

for i in alllinks:
    one_url = 'https://www.xsbiquge.com' + i[0]
    char = i[1]
设置休眠时间

利用time模块,添加time.sleep()来设置每一页的响应时间,以避免访问太过频繁被封。

小结(完整代码):

在获取链接的时候,数据猿开始对bs4有点不熟悉,一度想使用re库来获取,但是re库获取缺乏结构,稳定性较差,结果中有一个页面,多选取了一个class标签,而通过bs4则相对稳定,没有出现这个问题。

公众号:文科数据员 后台回复 爬小说 获取全文完整代码。

往期精品:

怎样把地球装进电脑里?

7个比Sci-Hub还牛的免费下载英文文献的方法

从开题报告到毕业论文,这 16 个工具帮你顺利毕业

你见过哪些Jupyter Notebook骚操作

文科数据员交流群来了,一起撸代码和量化研究方法吧!

本文系纯原创,如有纰漏,敬请指出

文字编辑:数据猿Riggle

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值