在网络上有许多优秀的小说资源,有时候我们可能希望将它们保存至本地以便离线阅读。本文将介绍如何使用 Python 爬虫,从指定小说网站上抓取小说内容,并保存为本地文本文件。
1. 简介
Python 爬虫是一种自动化工具,可以模拟浏览器行为,从网页上抓取数据。在本文中,我们将使用 Python 的 requests、parsel 和 tqdm 库来实现小说内容的抓取和保存。
2. 准备工作
首先,我们需要安装一些 Python 库:
- requests:用于发送 HTTP 请求和接收响应。
- parsel:用于解析 HTML 和 XML 文档。
- tqdm:用于显示进度条,提升用户体验。
你可以使用 pip 工具来安装这些库:
pip install requests parsel tqdm
3. 实现步骤
3.1 发送请求并获取网页内容
我们首先定义一个函数 GetResponse
,用于发送 HTTP 请求,并返回响应内容。
import requests
def GetResponse(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
}
response = requests.get(url=url, headers=headers)
return response
3.2 解析网页内容并提取小说章节信息
接下来,我们定义一个函数 GetInfo
,用于获取小说的名称和章节链接。
import parsel
def GetInfo():
novel_url = 'https://www.heenee.com/quanben/27/27066/'
novel_html = GetResponse(url=novel_url).text
selector = parsel.Selector(novel_html)
name = selector.css('.bdsub h1::text').get().split(' ')[0]
href = selector.css('.L a::attr(href)').getall()
chapter_url_list = ['https://www.heenee.com/' + i for i in href]
return name, chapter_url_list
3.3 获取章节内容并保存至本地
最后,我们定义一个函数 Save
,用于保存小说章节的标题和内容至本地文件。
def Save(name, title, content):
with open(name + '.txt', mode='a', encoding='utf-8') as f:
f.write(str(title))
f.write('\n\n')
f.write(content)
f.write('\n\n')
3.4 执行爬虫任务
在 if __name__ == '__main__':
下执行爬虫任务。
if __name__ == '__main__':
name, chapter_url_list = GetInfo()
print(f'正在采集{name},请等待。')
for chapter_url in tqdm(chapter_url_list):
title, content = GetContent(link=chapter_url)
Save(name, title, content)
4. 运行代码
# 导入数据请求模块
import requests
# 导入数据解析模块
import parsel
# 导入进度条模块
from tqdm import tqdm
def GetResponse(url):
# 模拟浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
}
# 发送请求
response = requests.get(url=url, headers=headers)
# 返回内容
return response
def GetContent(link):
"""获取小说内容单章"""
# 小说章节链接地址
link = 'https://www.heenee.com/quanben/27/27066/16579246.html'
# 调用发送请求
response = GetResponse(url=link)
# 获取数据内容
html = response.text
# 把获取到的html字符串数据 转成可解析对象
selector = parsel.Selector(html)
# 提取章节标题
title = selector.css('#amain h1::text').get() # 根据标签属性提取数据内容
# 提取章节内容
content_list = selector.css('#htmlContent p::text').getall()
# 把列表合并成字符串
content = '\n\n'.join(content_list)
# 返回标题 和 内容
return title, content
# 保存函数
def Save(name, title, content):
with open(name + '.txt', mode='a', encoding='utf-8') as f:
f.write(str(title))
f.write('\n\n')
f.write(content)
f.write('\n\n')
def GetInfo():
# 获取小说名字,章节链接
novel_url = 'https://www.heenee.com/quanben/27/27066/'
# 发送请求
novel_html = GetResponse(url=novel_url).text
# 把获取到的html字符串数据 转成可解析对象
selector = parsel.Selector(novel_html)
# 提取小说名字
name = selector.css('.bdsub h1::text').get().split(' ')[0]
# 提取小说章节链接
href = selector.css('.L a::attr(href)').getall()
chapter_url_list = ['https://www.heenee.com/' + i for i in href]
print(name)
print(href)
print(chapter_url_list)
return name, chapter_url_list
if __name__ == '__main__':
# 获取小说名字,章节链接
name, chapter_url_list = GetInfo()
print(f'正在采集{name},请等待。')
for chapter_url in tqdm(chapter_url_list):
# 调用获取章节标题/内容函数
title, content = GetContent(link=chapter_url)
# 保存数据
Save(name, title, content)
5. 总结
本文介绍了如何使用 Python 爬虫从指定网站上抓取小说内容,并保存至本地文件。通过学习本文,你可以掌握使用 Python 爬虫进行数据采集的基本方法,以及如何处理抓取到的数据内容。当然,在实际应用中,你还可以根据需求对代码进行进一步的优化和扩展,以满足更多的功能需求。