学习使用re做解析器爬小说
一、背景:近期学习python爬虫中看到,在对网页内容进行解析的技术中,re正则表达式工具也是一个很好的工具,使用re编制爬虫工具正好熟悉re正则表达式的使用。
二、环境及爬取目标
1、linux centos7系统
2、小说网站:http://www.xbiquge.la/15/15158 ,小说名称《汉乡》。
三、爬取思路
1、爬取目录页面,获得章节链接和标题List列表文件
2、根据章节链接和标题List列表文件内容,逐一爬取小说各章节,并写入预设文件名。
四、代码实现(代码文件名:test7.py)
#-*- coding:utf-8 -*-
import requests
import re
#通过目录页面获取小说各章节链接和标题列表
url="http://www.xbiquge.la/15/15158/"
html=requests.get(url).content.decode("utf-8") #获取目录页面内容
#print(html)
catalog=re.findall('<dd><a href=\'(/15/15158/\d+.html)\' >(.+?)</a></dd>', html, re.S) #返回章节链接和标题List列表文件,其中?表示使用非贪婪模式。
#print(catalog[0], catalog[len(catalog)-1]) #测试显示起始和结束章节的链接和标题
import requests
import re
#通过目录页面获取小说各章节链接和标题列表
url="http://www.xbiquge.la/15/15158/"
html=requests.get(url).content.decode("utf-8") #获取目录页面内容
#print(html)
catalog=re.findall('<dd><a href=\'(/15/15158/\d+.html)\' >(.+?)</a></dd>', html, re.S) #返回章节链接和标题List列表文件,其中?表示使用非贪婪模式。
#print(catalog[0], catalog[len(catalog)-1]) #测试显示起始和结束章节的链接和标题
#获取小说各章节内容并输出为预设文件
novelname="汉乡_test7.txt"
count_begin=0
#count_end=2 #调试用
count_end=len(catalog)
with open(novelname, mode="a", encoding="utf-8") as f:
for i in range(count_begin,count_end):
#print(catalog[i][0])
url_c="http://www.xbiquge.la" + catalog[i][0] #获得小说各章节的链接
title=catalog[i][1]
print("正在下载----------", title)
html_c=requests.get(url_c).content.decode("utf-8") #获得章节页面
#print(html_c)
text_l=re.findall('<div id="content">(.*?)</div>', html_c, re.S) #获得章节内容
text1=text_l[0].replace(' ', '').replace('<br />', '\n').replace('\15', '') #消除多余字符,其中\15是^M字符的八进制值
text=re.sub(r'<p>.*?</p>', '', text1, 0, re.S) #消除每个章节的广告段落,re.sub方法有五个参数:正则表达式规则、替代字符串、被替代的字符串、count、flag,count为0表示全部替换,flag设为re.S表示.代表的字符包含换行符\n。
#print(text)
f.write(title)
f.write('\n\n')
f.write(text)
f.write('\n\n')
f.close()
novelname="汉乡_test7.txt"
count_begin=0
#count_end=2 #调试用
count_end=len(catalog)
with open(novelname, mode="a", encoding="utf-8") as f:
for i in range(count_begin,count_end):
#print(catalog[i][0])
url_c="http://www.xbiquge.la" + catalog[i][0] #获得小说各章节的链接
title=catalog[i][1]
print("正在下载----------", title)
html_c=requests.get(url_c).content.decode("utf-8") #获得章节页面
#print(html_c)
text_l=re.findall('<div id="content">(.*?)</div>', html_c, re.S) #获得章节内容
text1=text_l[0].replace(' ', '').replace('<br />', '\n').replace('\15', '') #消除多余字符,其中\15是^M字符的八进制值
text=re.sub(r'<p>.*?</p>', '', text1, 0, re.S) #消除每个章节的广告段落,re.sub方法有五个参数:正则表达式规则、替代字符串、被替代的字符串、count、flag,count为0表示全部替换,flag设为re.S表示.代表的字符包含换行符\n。
#print(text)
f.write(title)
f.write('\n\n')
f.write(text)
f.write('\n\n')
f.close()
五、运行:
(base) [python@ELK ~]$ python test7.py
正在下载---------- 第一章 预言
正在下载---------- 第二章 被烧焦了
正在下载---------- 第三章 虎外婆
正在下载---------- 第四章 始皇帝的太宰
正在下载---------- 第五章大人为上,礼为尊
正在下载---------- 第一章 预言
正在下载---------- 第二章 被烧焦了
正在下载---------- 第三章 虎外婆
正在下载---------- 第四章 始皇帝的太宰
正在下载---------- 第五章大人为上,礼为尊
......