1. 模块的使用:
- `requests` 模块用于发起HTTP请求并获取响应。
- `parsel` 模块用于数据解析,通常用于解析网页内容。
- `tqdm` 模块用于显示进度条,可以在循环中显示任务的完成进度。
- `PrettyTable` 模块用于创建漂亮的表格,可以用于显示数据。
2. 基本流程的实现:
- 明确需求:确保清楚了解需要实现的功能和流程。
- 抓包分析:通过抓包工具分析网站的请求和响应,以便了解数据的结构和请求方式。
- 发送请求:使用 `requests` 模块发送HTTP请求获取数据。
- 获取数据:从响应中获取需要的数据。
- 解析数据:使用 `parsel` 模块对获取的数据进行解析。
- 存储数据:将解析后的数据存储到文件或数据库中。
3. 函数的使用:
- 定义函数来封装特定功能,使代码结构清晰和模块化。
- 函数包括发送请求函数 `GetResponse(url)`、获取小说章节内容函数 `GetContent(link)`、保存小说内容函数 `Save(name, title, content)`、获取小说信息函数 `GetInfo(NovelID)` 和搜索小说函数 `Search(key)`。
4. 交互性编程:
- 使用 `if __name__ == '__main__':` 部分可以使代码在被直接运行时执行一些特定的操作,如接收用户输入、调用函数等。
通过整理和编写Python脚本,您展示了对数据请求、解析和交互编程的理解和应用。这些知识点对于开发网络爬虫、数据获取和处理等任务都非常重要。如果您想了解更多细节或有其他问题,请随时告诉我。我很乐意继续帮助您。
实现效果:
代码:
"""
模块使用
1.requests 数据请求
2.parsel 数据解析
3.prettytable 指表模块
4.tqdm 进度条模块
小说网址:https://www.heenee.com/
1.采集单章小说
2.采集正本小说
2.实现搜索下载功能 / 打包成exe软件
找到搜索接口(书名/作者/id)
实现基本流程
1.明确需求
1.1 抓包分析
2.发送请求
3.获取数据
4.解析数据
5.存储数据
"""
# 导入数据请求模块
import requests
# 导入数据解析模块
import parsel
# 导入进度条模块
from tqdm import tqdm
# 导入建表模块
from prettytable import PrettyTable
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)
# 返回标题 和 内容
# print(title)
# print(content)
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(NovelID):
# 获取小说名字,章节链接
novel_url = F'https://www.heenee.com{NovelID}'
# 发送请求
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
def Search(key):
# 搜索接口
search_url = f'https://www.heenee.com/api/search?q={key}'
# 发送请求
json_date=GetResponse(url=search_url).json()
# 实例化对象
tb = PrettyTable()
# 添加字段名
tb.field_names=['序号','书名','作者']
page=0
info_list=[]
# 字典取值,键值对取值
for index in json_date['data']['search']:
dit={
'书名':index['book_name'],
'作者':index['author'],
'ID':index['book_list_url'],
}
info_list.append(dit)
# 添加每行数据
tb.add_row([page,index['book_name'],index['author']])
# 循环 序号加1
page +=1
print(tb)
return info_list
if __name__ == '__main__':
word=input('请输入你要下载的小说/作者:')
info_list = Search(key=word)
num = input('请输入你要下载的序号:')
NoNovelID=info_list[int(num)]['ID']
# 获取小说名字,章节链接
name, chapter_url_list = GetInfo(NovelID=NoNovelID)
print(f'正在采集{name},请等待。')
for chapter_url in tqdm(chapter_url_list):
# 调用获取章节标题/内容函数
title, content = GetContent(link=chapter_url)
# 保存数据
Save(name, title, content)