前言
嗨喽,大家好呀~这里是爱看美女的茜茜呐
又到了学Python时刻~
一个看书党一年有多少money投入小说行业呢~
碰上一本好看的书,你能购买上多少章呢~
其中的投入,无法想象,尤其是兴致上来了,不得投上个礼物给作者催催更?
最近,我朋友发现了我有着个小说下载器,立马找上我
要我给她下上个几千张,可以随时观看,这样即省了钱,又看了小说
(当然,如果你手上还算富裕,可以支持作者正版小说哦~)
基本四个步骤:
采集一章小说内容
-
发送请求, 模拟浏览器对于url地址发送请求
-
获取数据, 获取网页源代码
-
解析数据, 提取我们想要的数据内容
小说章节名
小说内容
-
保存数据, 把小说内容本地文件 txt
代码展示
导入模块
# 导入数据请求模块
import requests
# 导入数据解析模块
import parsel
# 导入正则
import re
# 导入格式化打印
import prettytable as pt
# 导入进度条
from tqdm import tqdm
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
伪装
请求头 字典数据类型, 构建完整键值对
headers = {
# user-agent 用户代理 表示浏览器基本身份信息
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
}
def get_response(html_url):
- 1
- 2
- 3
- 4
- 5
- 6
- 7
发送请求
自定义函数:
-
def 关键字 定义函数
-
get_response 函数名 自定义
html_url 形式参数
-
:param html_url: 给个网址就可以了
-
:return:response 返回响应对象
模拟浏览器对于url地址发送请求
headers 请求头 --> 可以直接复制粘贴
# 发送请求
response = requests.get(url=html_url, headers=headers)
return response
- 1
- 2
- 3
return
关键字 返回 response
响应对象
<Response [200]>
响应对象 表示请求成功
获取小说名字 / 小说章节url
def get_novel_info(novel_url):
"""
获取小说名字 / 小说章节url
:param novel_url: 小说目录页url地址
:return:
"""
# 发送请求, 获取网页源代码
html_data = get_response(html_url=novel_url).text
# 把获取下来 html字符串数据 <response.text>, 转成可解析对象
selector = parsel.Selector(html_data)
# 提取小说名字
name = selector.css('.novel_info_title h1::text').get()
# 提取小说章节url attr 属性选择器, 提取标签里面属性内容
link_list = selector.css('.chapter_list a::attr(href)').getall()
# https://ssbiqu.com/book/5613/4217210.html 列表推导式
link_list = ['https://****.com' + i for i in link_list]
return name, link_list
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
获取小说内容函数
def get_content(html_url):
"""
获取小说内容函数
:param html_url: 形参 传入小说章节url地址
:return: 章节名 / 小说内容
"""
# 调用前面定义好的发送请求函数
response = get_response(html_url=html_url)
# 获取网页源代码, html字符串数据
# print(response.text)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
解析提取,
小说章节名, 以及小说内容
-
根据标签属性提取数据内容
-
小说章节名字
.style_h1
定位标签get()
获取第一个标签内容 相当于获取一个, 返回字符串getall()
获取所有标签内容, 返回列表
-
html字符串数据 <response.text>, 转成可解析对象
selector = parsel.Selector(response.text)
- 1
提取标题
title = selector.css('.style_h1::text').get()
- 1
提取内容
content_list = selector.css('#article>p::text').getall()
- 1
保存文字, 保存字符串数据
所有要把 列表转成字符串数据类型
列表转成字符串数据类型?
for
遍历提取列表里面元素
str
强制转换数据类型
str.join()
把列表合并为字符串
'\n'.join(content_list)
以换行符, 把列表里面元素一个一个合并起来变成一个字符串
content = '\n'.join(content_list)
- 1
返回标题, 小说内容
return title, content
- 1
保存函数
def save(name, title, content):
"""
python学习交流Q裙:261823976 ### 源码领取
保存函数
:param title: 小说章节名
:param content: 小说内容
:return:
"""
# # replace 字符串替换, 把 / 替换成 -
# title = title.replace('/', '-') 保存 a 追加 w 写入会覆盖
with open(name + '.txt', mode='a', encoding='utf-8') as f:
f.write(title)
f.write('\n')
f.write(content)
f.write('\n')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
搜索函数
def search(word):
"""
搜索函数
:param word: 小说名
:return:
"""
search_url = 'https://*****.com/search/'
data = {
'searchkey': word
}
search_data = requests.post(url=search_url, data=data, headers=headers).text
novel_id_list = re.findall('<a href="/book/(\d+)/">', search_data)
name_list = re.findall('<h3>(.*?)<span class="hot">(.*?)</span>(.*?)</h3>', search_data)
name_list = [''.join(j) for j in name_list]
# 仅匹配中文
writer_list = re.findall('<i class="fa fa-user-circle-o"> </i>.*?(.*?) <span class="s_gray">', search_data)
writer_list = [z.replace('<span class="hot">', '').replace('</span>', '') for z in writer_list]
tb = pt.PrettyTable()
tb.field_names = ['序号', '书名', '作者', '书ID']
page = 0
novel_info_list = []
for novel_id, name, writer in zip(novel_id_list, name_list, writer_list):
dit = {
'书名': name,
'作者': writer,
'书ID': novel_id,
'信息': '完整源码获取加Q裙: 261823976'
}
print(dit)
novel_info_list.append(dit)
tb.add_row([page, name, writer, novel_id])
page += 1
print(tb)
num = input('请输入你想要下载小说序号: ')
novel = novel_info_list[int(num)]['书ID']
return novel
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
获取小说名字
ef main(word):
"""
主函数
:return:
"""
novel_id = search(word)
# 小说目录页 https://ssbiqu.com/book/5613/
url = f'https://****.com/book/{novel_id}/'
# 获取小说名字
name, link_list = get_novel_info(novel_url=url)
# for循环遍历 提取内容
for link in tqdm(link_list):
# 获取小说内容
title, content = get_content(html_url=link)
save(name, title, content)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
PS:源码如有需要的小伙伴可以加下方的群去找管理员免费领取
尾语 ?
我给大家准备了一些资料,包括:
2022最新Python视频教程、Python电子书10个G
(涵盖基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题)、Python学习路线图等等
直接在文末名片自取即可!
有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง
喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!