我们要爬取的小说为以下小说,结尾附上整体代码以及注意事项
在这篇文章中,我将展示如何使用Python和正则表达式来爬取整篇小说的内容。我们的目标是从"bbiquge"网站上获取某本小说的全文内容,并保存为.txt文件。我们将使用requests库进行网络请求,使用re和parsel库来解析页面,并把小说内容保存到本地。
1.导入需要的模块:此段代码首先导入了几个Python的标准库如os.path
、re
,以及第三方库requests
和parsel
。这些库分别用于处理文件路径、处理正则表达式、发送HTTP请求和解析HTML文档。
import os.path
import re
import requests
import parsel
2.设置初始参数:设置了小说的URL(list_url
),以及发送HTTP请求时使用的请求头(headers
)。请求头中的User-Agent是用来伪装成一个正常的浏览器,以防止服务器因为检测到是爬虫而拒绝服务。
list_url='https://www.bbiquge.net/book/133303/'
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
3.发送请求并获取响应:通过requests.get
方法发送GET请求到list_url
,并使用headers
作为请求头。然后获取响应并设置响应的编码为'gbk'。
response=requests.get(url=list_url,headers=headers)
response.encoding='gbk'
4.提取信息:使用re.findall
方法和正则表达式从响应的文本中提取所有的章节链接(href
)以及小说的名字(name
)。
href=re.findall('<dd><a href="(.*?)">(.*?)</a></dd>',response.text)
name=re.findall('<div id="picbox"><div class="img_in"><img src="https://www.biqugevip.net/files/article/image/133/133301/133301s.jpg" alt="(.*?)"',response.text)[0]
5.遍历所有章节并下载:对每一个提取到的章节链接,发送GET请求获取章节页面的HTML,然后解析HTML以提取章节标题和内容。最后,将提取到的标题和内容写入到本地的txt文件。
for index in href:
index_url='https://www.biqugevip.net/book/133303/'+index[0]
selector=parsel.Selector(requests.get(url=index_url,headers=headers).text)
title=selector.css('#main > h1::text').get()
contest_list=selector.css('#content::text').getall()
contest="\n".join(contest_list)
with open(fr'D:\爬取文本存放位置\一百种爬虫方式\{name}.txt',mode='a', encoding='utf-8') as f:
f.write(title)
f.write('\n')
f.write(contest)
f.write('\n')
print('正在保存:',title)
在这段代码中,首先是拼接出每个章节的URL(index_url
)。然后发送GET请求获取章节页面的HTML,并使用parsel.Selector
对HTML进行解析。然后提取出章节的标题(title
)以及内容(contest_list
),并将内容的列表通过\n
合并成一个字符串(contest
)。最后,打开(如果不存在则创建)一个txt文件,并以追加的模式将标题和内容写入文件。在写入每个章节的内容后,会打印一条消息表示该章节已经保存。
运行结果:
效果展示:
整体代码
# _*_coding :utf-8 _*_
# @time 2023/7/14 20:24
# @Author :volcano
# @File 爬取小说
# @Proect :workspace
#模拟浏览器对服务器发送请求
#导入请求模块
import os.path
import re
import requests
#导入解析模块
import parsel
list_url='https://www.bbiquge.net/book/133303/'#用自定义的变量接收字符串的数据内容
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
}
response=requests.get(url=list_url,headers=headers)
response.encoding='gbk'
# print(response.text.replace('<br>', '\n')) # 使用replace将"<br>"替换为换行符"\n"
href=re.findall('<dd><a href="(.*?)">(.*?)</a></dd>',response.text)
name=re.findall('<div id="picbox"><div class="img_in"><img src="https://www.biqugevip.net/files/article/image/133/133301/133301s.jpg" alt="(.*?)"',response.text)[0]
# print(href)
for index in href:
index_url='https://www.biqugevip.net/book/133303/'+index[0]
# print(index_url)
selector=parsel.Selector(requests.get(url=index_url,headers=headers).text)
#h1::text提取h1标签当中的文本 get的意思是获得的意思
title=selector.css('#main > h1::text').get()
# print(title)
contest_list=selector.css('#content::text').getall()
contest="\n".join(contest_list)
# print(string)
with open(fr'D:\爬取文本存放位置\一百种爬虫方式\{name}.txt',mode='a', encoding='utf-8') as f:
f.write(title)
f.write('\n')
f.write(contest)
f.write('\n')
print('正在保存:',title)