前言
小说网站-笔趣阁:URL:https://www.qu.la/
笔趣阁是一个盗版小说网站,这里有很多起点中文网的小说,该网站小说的更新速度稍滞后于起点中文网正版小说的更新速度。并且该网站只支持在线浏览,不支持小说打包下载。因此,本次实战就是从该网站爬取并保存一本名为《终极斗罗》的小说,该小说是唐家三少正在连载中的一部玄幻小说。
PS:本实例仅为交流学习,支持唐三大大,请上起点中文网订阅。
正文
一、开发环境
运行平台: Windows 10
Python版本: Python3.6
IDE: PyCharm
二、爬取思路
- 抓取单章内容
- 提取有用信息,并进行清理
- 获取每一章名字和对应的URL
- 下载每一章小说内容并整合保存成txt文档
爬取单章内容
首先打开Chrome浏览器,打开笔趣阁(https://www.qu.la/) 找到需要爬取的小说《终极斗罗》(https://www.qu.la/book/101104/ ) 然后找到第一章点击打开。
然后通过requests库将整个HTML代码获取下来:
# -*- coding:UTF-8 -*-
import requests
if __name__ == '__main__':
target = 'https://www.qu.la/book/101104/5281139.html'
req = requests.get(url=target)
req.encoding = req.apparent_encoding # 因为网站头部没有指定编码,因此需要requests自己去判断
html = req.text
print(html)
运行代码,可以看到如下结果:
可以看到,我们很轻松地获取了HTML信息。但是,很显然,很多信息是我们不想看到的,我们只想获得如右侧所示的正文内容,我们不关心div、br这些html标签。如何把正文内容从这些众多的html标签中提取出来呢?这就是本次实战的主要内容。
提取有用的信息并进行清理
我们利用beautiful soup库进行提取想要的内容
import requests
from bs4 import BeautifulSoup
if __name__ == '__main__':
target = 'https://www.qu.la/book/101104/5281139.html'
req = requests.get(url=target)
req.encoding = req.apparent_encoding # 因为网站头部没有指定编码,因此需要requests自己去判断
html = req.text
bf = BeautifulSoup(html, "html5lib")
texts = bf.find_all('div', id='content')
print(texts)
然后我们可以看到,我们提取了想要的正文部分,但是里面有许多空格和< br/ >标签,我们需要将其清洗出去:
# -*- coding:UTF-8 -*-
import requests,re
from bs4 import BeautifulSoup
if __name__ == '__main__':
target = 'https://www.qu.la/book/101104/5281139.html'
req = requests.get(url=target)
req.encoding = req.apparent_encoding # 因为网站头部没有指定编码,因此需要requests自己去判断
html = req.text
bf = BeautifulSoup(html, "html5lib")
texts = bf.find_all('div', id='content')
print(texts)
texts = str(texts[0])
pattern = re.compile('.*?<br/>') # 选出所有以<br/>为结尾的
conts = re.findall(pattern, texts)
conts[0] = conts[0].lstrip()
conts[0] = ' ' + conts[0] # 第一行行首会有多余的空格
for i in range(len(conts)