前言 嗨喽!这里是魔王,欢迎来到这篇文章。小说想必大家非常熟悉, 无论上班、在家还是干什么只要空闲,许多人都会看看小说让自己的精神世界解解馋!但是有时候叭,没钱!流量贵!免费看书软件一大堆广告!又是一大难题,哎!生活!那么今天我就为大家带来一个好案例!用python制作爬取小说下载器!
案例:Python实现全网小说下载器
- python 3.8
- pycharm
requests >>> 数据请求模块 pip install requests parsel >>> 数据解析模块 pip install parsel >>> 这个模块不支持 3.9,最好是3.8或3.6
安装方法win + R 输入 cmd 然后点击确定 在输入 安装命令 如果出现红色报错, 网络连接超时 是需要切换国内的镜像源 黄色是警告 提示你可以更新pip版本
如果爬取的是小说内容
– 小试牛刀 爬取一章小说 – 爬取一本小说内容 – 搜索小说名字 然后就可以下载相应的小说内容
如果你想要的通过Python代码取进行下载小说
– 如何获取这些数据内容 >>> 小说章节标题 以及 小说内容 (用Python代码模拟浏览器 发送请求) – 弄一个下载进度条显示 – 控制爬取的速度 就不会爬蹦
爬虫基本步骤- 发送请求
- 获取数据
- 解析数据, 目标 获取 小说章节标题 以及 小说内容
def get_response(html_url):
response = requests.get(html_url)
return response
二. 获取所有章节url地址
def get_novel_url(html_url):
response = get_response(html_url)
selector = parsel.Selector(response.text)
href = selector.css('#list dd a::attr(href)').getall()
return href
三. 获取小说的内容
def get_novel_content(html_url):
response = get_response(html_url)
selector = parsel.Selector(response.text)
# 才可以调用 selector 对象里面 css选择器方法 进行解析提取数据
title = selector.css('.bookname h1::text').get() # 这个是获取一个 小说章节标题
content_list = selector.css('#content::text').getall() # 获取所有
content = '\n'.join(content_list) # 小说内容
novel_content = [title, content]
return novel_content
四. 保存数据
def save(name, title, content):
with open(name + '.txt', mode='a', encoding='utf-8') as f:
f.write(title)
f.write('\n')
f.write(content)
f.write('\n')
五. 主函数 整合所有函数内容
def main(html_url):
response_1 = get_response(html_url)
selector = parsel.Selector(response_1.text)
# 才可以调用 selector 对象里面 css选择器方法 进行解析提取数据
name = selector.css('#info h1::text').get() # 这个是获取一个 小说章节标题
href = get_novel_url(html_url) # 调用了获取小说章节url地址的函数
for index in tqdm(href):
index_url = 'https://www.biqugee.com' + index
novel_content = get_novel_content(index_url) # 调用了获取小说内容函数
save(name, novel_content[0], novel_content[1]) # 调用了 保存函数
六. 制作下载器
if __name__ == '__main__':
key_world = input('请输入你要下载的小说名字: ')
search_url = f'https://www.biqugee.com/search.php?q={key_world}'
response_1 = get_response(html_url=search_url)
select = parsel.Selector(response_1.text)
divs = select.css('div.result-game-item-detail')
lis = []
if divs:
for div in divs:
novel_url = div.css('.result-item-title a::attr(href)').get().split('/')[-2]
novel_name = div.css('.result-item-title a::attr(title)').get()
author = div.css('.result-game-item-info p:nth-child(1) span:nth-child(2)::text').get()
dit = {
'小说名字': novel_name,
'作者': author,
'书ID': novel_url,
}
lis.append(dit)
search_result = pd.DataFrame(lis)
print(f'搜索到{len(search_result)}条数据内容, 结果如下: ')
print(search_result)
novel_num = input('请输入你要下载的小说序号: ')
novel_id = lis[int(novel_num)]['书ID']
url = f'https://www.biqugee.com/book/{novel_id}/'
main(url)
else:
print('重新输入内容')
七. 最终效果