嗨喽~大家好呀,这里是魔王呐 ❤ ~!
python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取
环境使用:
-
Python 3.8
-
Pycharm
模块使用:
-
requests --> pip install requests
-
re
-
parsel
代码展示:
导入模块
# 导入数据请求模块
import requests
# 导入正则表达式模块
import re
# 导入数据解析模块
import parsel
from prettytable import PrettyTable
from tqdm import tqdm
模拟浏览器
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
while True:
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36'
}
"""实现搜索下载功能"""
key = input('请输入你要下载的小说: 输入00退出 ')
if key == '00':
break
tb = PrettyTable()
tb.field_names = ['序号', '书名', '作者', '类型', '最新章节', 'ID']
num = 0
info = []
print('正在检索中, 请稍后.....')
for page in tqdm(range(30)):
search_url = 'https://fanqienovel.com/api/author/search/search_book/v1'
# 请求参数
search_params = {
'filter': '127,127,127,127',
'page_count': '10',
'page_index': page,
'query_type': '0',
'query_word': key,
}
# 发送请求
search_data = requests.get(url=search_url, params=search_params, headers=headers).json()
for i in search_data['data']['search_book_data_list']:
book_name = i['book_name']
author = i['author']
book_id = i['book_id']
category = i['category']
last_chapter_title = i['last_chapter_title']
dit = {
'book_name': book_name,
'author': author,
'category': category,
'last_chapter_title': last_chapter_title,
'book_id': book_id,
}
info.append(dit)
tb.add_row([num, book_name, author, category, last_chapter_title, book_id])
num += 1
print(tb)
book = input('请输入你要下载小说序号: ')
"""获取小说名字以及章节ID"""
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 请求链接
url = f'https://fanqienovel.com/page/{info[int(book)]["book_id"]}'
# 发送请求
response = requests.get(url=url, headers=headers)
# 获取网页源代码 html字符串数据
html_data = response.text
# 正则提取小说名
name = re.findall('<div class="info-name"><h1>(.*?)</h1', html_data)[0]
# 把获取到html字符串数据,转成可解析对象
selector = parsel.Selector(html_data)
# css选择器提取小说名
css_name = selector.css('.info-name h1::text').get()
# 提取章节ID
href = selector.css('.chapter-item a::attr(href)').getall()
print(f'{name}, 小说正在下载, 请稍后....')
# for循环遍历提取列表里面元素
for index in tqdm(href):
# 字符串分割提取ID -> 列表
chapter_id = index.split('/')[-1]
# 构建小说数据链接地址
link = f'https://novel.snssdk.com/api/novel/book/reader/full/v1/?device_platform=android&parent_enterfrom=novel_channel_search.tab.&aid=2329&platform_id=1&group_id={chapter_id}&item_id={chapter_id}'
# 对于内容链接地址发送请求, 获取数据
json_data = requests.get(url=link, headers=headers).json()['data']['content']
# 提取章节标题名
title = re.findall('<div class="tt-title">(.*?)</div>', json_data)[0]
# 提取小说内容 -> 列表合并成字符串
content = '\n'.join(re.findall('<p>(.*?)</p>', json_data))
# 保存小说内容
with open(f'{name}.txt', mode='a', encoding='utf-8') as f:
"""
第一章 章节名
小说内容
第二章 章节名
小说内容
"""
f.write(title)
f.write('\n')
f.write(content)
f.write('\n')
"""
解析数据方法:
re: 直接对于字符串数据进行解析提取
- re.findall()
返回列表
css: 根据标签属性提取数据
- 找到对应数据标签位置
.info-name h1 -> 定位class类名为info-name下面h1标签
xpath: 根据标签节点提取数据
xpath_name = selector.xpath('//*[@class="info-name"]/h1/text()').get()
"""
尾语
最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬
希望本篇文章有对你带来帮助 🎉,有学习到一点知识~
躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。