学习使用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])    #测试显示起始和结束章节的链接和标题
 
#获取小说各章节内容并输出为预设文件
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('&nbsp;&nbsp;&nbsp;&nbsp;', '').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
正在下载---------- 第一章 预言
正在下载---------- 第二章 被烧焦了
正在下载---------- 第三章 虎外婆
正在下载---------- 第四章 始皇帝的太宰
正在下载---------- 第五章大人为上,礼为尊
......
posted @ 2019-08-14 16:31  sfccl  阅读(424)  评论(0编辑  收藏  举报