使用正则表达式爬取一本喜欢的小说
这个爬虫的案例是对正则表达式的运用,通过这个案例,我们可以对正则表达式有更深入的了解。
1. 信息来源:
努努书坊。爬取的小说:三国演义。链接为:https://www.kanunu8.com/files/old/2011/2447.html
2. 解析需要爬取的信息:
进入主页,我们可以看到如上图所示的信息,我们需要爬取的就是上图中的所有内容。即每个章节中的内容。这是一个两层爬虫,即我们首先要得到每个章节的链接,再通过每个章节的链接得到每个章节的信息。
我们在主页中点击右键——>查看网页源代码——>找到对应的章节的信息——>如图所示——>获取出对应的链接信息和标题
我们对上图所示的信息进行分析,可以发现:(匹配就得多试验,每个人的匹配方式可能不同,多尝试)
- 链接和标题可以通过正则表达式—— r'<td( width="50%")?><a href="(.+\.html)">(.+)</a>' 匹配到;
- 正文信息可以通过正则表达式—— r'<p>(.+)</p>' 匹配到;
3. 代码如下:
import requests
import re
url='https://www.kanunu8.com/files/old/2011/2447.html'
txt=requests.get(url).content.decode('gbk')
m1=re.compile(r'<td colspan="4" align="center"><strong>(.+)</strong>')
print(m1.findall(txt)[0])
m2=re.compile(r'<td( width="50%")?><a href="(.+\.html)">(.+)</a>')
raw=m2.findall(txt)
sanguo=[]
r_url='https://www.kanunu8.com/files/old/2011/'
for i in raw:
sanguo.append([i[2],r_url+i[1]])
m3=re.compile(r'<p>(.+)</p>',re.S)
m4=re.compile(r'<br />')
#保存到文件中
with open('三国演义.txt','a')as f:
for zj in sanguo:
zj_url=zj[1]
print("正在下载----->",zj[0])
r_nr=requests.get(zj_url).content.decode('gbk')
n_nr = m3.findall(r_nr)
f.write('\n'+zj[0]+'\n')
f.write(m4.sub('',n_nr[0]))
结果如下:小说就被我们成功的爬取下来了。