原理
通过BeautifulSoup解析网页源码,通过正则表达式将小说正文从源码中筛选出来,根据标签取得下一章的url实现循环爬取整部小说。
思路
- 使用浏览器打开要爬取的网页,右键查看网页源码
- 分析要爬取的内容所在的标签
- 通过BeautifulSoup将要爬取的标签筛选出来
- 使用正则表达式做进一步的筛选处理
按照上面的思路配合代码以及网页源码很快就能理解整个过程了
# 导入urllib下的request模块
import urllib.request
# 导入正则匹配包
import re
from bs4 import BeautifulSoup
# -*- encoding:utf-8 -*-
#fo = open("jianlai.txt", "w+")
#第一章的url结尾
page = '/book/17.html'
while True:
#小说网址
url='http://www.jianlaixiaoshuo.com'+str(page)
try:
#打开url
html = urllib.request.urlopen(url).read()
#用lxml解释器解析网页
webSourceCode=BeautifulSoup(html,'lxml')
except:
#当前网页解析失败
print("error")
break
else:
#爬取标题
title=webSourceCode.find('h1')
#爬取正文
txts=webSourceCode.find('div',id='BookText')
#删除正文的script
[s.extract() for s in txts('script')]
print(title.get_text())
#打开要写入的文件
fo = open(title.get_text()+'.txt', "w+")
#遍历正文
for txt in txts:
txt=str(txt)
#替换正文中标签
txt=re.sub(r'<p>','',txt)
txt=re.sub(r'</p>','',txt)
#写入正文
fo.write(txt)
#取得下一章的url链接
next=webSourceCode.find('a',rel='next')
#到达最后一章,停止爬取
if next is None:
break
page=next.get('href')
#关闭文件
fo.close()
爬取结果
注意
python3.7自带的lxml解析器有可能会解析失败,执行pip3 install lxml安装即可。