用python爬虫bqg小说(re正则表达式)
一.准备工作
1.安装re
库
2.安装requests
库
3.使用笔趣阁网址https://www.quge7.com
4.本代码基于Python3.8
,
二.re 正则表达式的用法
1.compile
用来截取网页源代码中的内容
2.finditer
用来对compile
中的内容进行提取,并返回一个迭代器
三. 原理及实现
1.进入该页面.2.右键点击空白处审查元素,点击Network
,刷新该页面,找到该网址的Network
,确定Requests Method
为get
模式
3.使用requests
进行get
访问网页,并对访问结果进行储存。
url = "https://www.quge7.com"
resp = requests.get(url)
page = resp.text
4.右键点击空白页面处页面源代码,对要访问的内容进行查找
图片中红色表框为要寻找的书名,蓝色表框中则为要进行访问的网址。
5. 使用re.compile
进行对蓝色表框中的内容进行提取,使用finditer
进行对compile
中的寻找,并返回一个迭代器
obj = re.compile(r'alt="剑来"></a></div><dl><dt><span>烽火戏诸侯</span><a href="(?P<web>.*?)"',re.S) #爬取书
result = obj.finditer(page)
for i in result:
url1 = i.group("web")
group
是对(?P<web>.*?)
中的进行正则表达式中用于获取分段截获的字符串
6.对返回的web
进行深入访问,即可进入子页面中,在此处进行子页面访问时要加入主页面的网址
8.右键点击页面空白处,点击网页源代码,进入子页面网页源代码中选择要进行爬取的章节
图片中分别标注了1,2,3
,我们要对2 中的内容进行提取,使用compile
函数1,3
分别为限制,即可对2
进行提取。
再次使用finditer
对compile
进行查询,返回一个迭代器。
child_page_resp = requests.get("https://www.quge7.com" + url1,headers=header)
child_page = child_page_resp.text
obj1 = re.compile(r'<dd><a href ="(?P<zhangjie>.*?)">(?P<name>.*?)</a>',re.S) #爬取章节地址
result1 = obj1.finditer(child_page)
9.对2进行访问,此时进入一个新的有着内容的页面,再次右键点击网页源代码,搜索到小说的内容,再次使用compile,finditer
进行爬取。
for it in result1:
url2 = it.group('zhangjie')
url2_name = it.group('name')
child_page_page_resp = requests.get("https://www.quge7.com"+url2)
child_page_page = child_page_page_resp.text
obj2 = re.compile(r'<div id="chaptercontent" class="Readarea ReadAjax_content"> (?P<passage>.*?)<p class="readinline">',re.S) #爬取章节内容
result2 = obj2.finditer(child_page_page)
for itt in result2:
url3 = itt.group('passage')
10.对爬取的小说内容进行保存。
for itt in result2:
url3 = itt.group('passage')
with open (f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'w',encoding='utf-8',errors='ignore') as f:
f.write(url3)
f.close()
11.此时你会发现保存的内容中有一些网页中的内容,对于我们这些聪明的程序员来说,那可谓是小菜一带啊,以此我是用了再次打开文件,对文件进行读取访问,并对文件中的一些内容进行replace
with open(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'r+',encoding='utf-8',errors='ignore') as fo:
contents = fo.readlines()
fo.close()
with open(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'w',encoding='utf-8',errors='ignore') as foo:
for line in contents:
line_reach = line.replace('<br /><br />', '\n')
foo.write(line_reach)
foo.close()
print(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt over!")
time.sleep(1)
print("over")
四.全部的源代码如下:
import re
import requests
import time
url = "https://www.quge7.com"
resp = requests.get(url)
page = resp.text
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
obj = re.compile(r'alt="剑来"></a></div><dl><dt><span>烽火戏诸侯</span><a href="(?P<web>.*?)"',re.S) #爬取书
result = obj.finditer(page)
for i in result:
url1 = i.group("web")
child_page_resp = requests.get("https://www.quge7.com" + url1,headers=header)
child_page = child_page_resp.text
obj1 = re.compile(r'<dd><a href ="(?P<zhangjie>.*?)">(?P<name>.*?)</a>',re.S) #爬取章节地址
result1 = obj1.finditer(child_page)
for it in result1:
url2 = it.group('zhangjie')
url2_name = it.group('name')
child_page_page_resp = requests.get("https://www.quge7.com"+url2)
child_page_page = child_page_page_resp.text
obj2 = re.compile(r'<div id="chaptercontent" class="Readarea ReadAjax_content"> (?P<passage>.*?)<p class="readinline">',re.S) #爬取章节内容
result2 = obj2.finditer(child_page_page)
for itt in result2:
url3 = itt.group('passage')
with open (f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'w',encoding='utf-8',errors='ignore') as f:
f.write(url3)
f.close()
with open(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'r+',encoding='utf-8',errors='ignore') as fo:
contents = fo.readlines()
fo.close()
with open(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'w',encoding='utf-8',errors='ignore') as foo:
for line in contents:
line_reach = line.replace('<br /><br />', '\n')
foo.write(line_reach)
foo.close()
print(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt over!")
time.sleep(1)
print("over")
五.参考资料
1.python re的findall和finditer
2.python re.compile() 详解——Python正则表达式
3.正则表达式以及group的用法