', response.text, re.S)[0].replace('
', '\n')
css选择器: 根据标签属性提取数据
.bookname h1::text
类名为bookname下面h1标签里面文本
get() --> 提取第一个标签数据内容 返回字符串
getall() --> 提取多个数据, 返回列表
# 提取标题
title = selector.css('.bookname h1::text').get()
# 提取内容
content = '\n'.join(selector.css('#content::text').getall())
xpath节点提取: 提取标签节点提取数据
整本小说下载
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
import requests
import re
import parsel
import os
# 请求链接: 小说目录页
list_url = 'https://www.biqudu.net/1_1631/'
# 模拟浏览器 headers 请求头
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'
}
# 发送请求
html_data = requests.get(url=list_url, headers=headers).text
# 提取小说名字
name = re.findall('(.*?)
', html_data)[0]
# 自动创建一个文件夹
file = f'{name}\\'
if not os.path.exists(file):
os.mkdir(file)
# 提取章节url
url_list = re.findall('- '
, html_data)
# for循环遍历
for url in url_list:
index_url = 'https://www.biqudu.net' + url
print(index_url)
# # 请求链接
# url = 'https://www.biqudu.net/1_1631/3047506.html'
# 模拟浏览器 headers 请求头
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'
}
# 发送请求
response = requests.get(url=index_url, headers=headers)
# 响应对象, 表示请求成功
print(response)
# 获取下来response.text , 转成可解析对象
selector = parsel.Selector(response.text)
# 提取标题
title = selector.xpath('//*[@class="bookname"]/h1/text()').get()
# 提取内容
content = '\n'.join(selector.xpath('//*[@id="content"]/text()').getall())
print(title)
# print(content)
# title <文件名> '.txt' 文件格式 a 追加保存 encoding 编码格式 as 重命名
with open(file + title + '.txt', mode='a', encoding='utf-8') as f:
f.write(title)
f.write('\n')
f.write(content)
f.write('\n')
多线程采集小说
导入模块
import requests
import re
import parsel
import os
import concurrent.futures
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
def get_response(html_url):
"""
发送请求函数
:param html_url: 请求链接
:return: response响应对象
"""
# 模拟浏览器 headers 请求头
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'
}
response = requests.get(url=html_url, headers=headers)
return response
def get_list_url(html_url):
"""
获取章节url/小说名
:param html_url: 小说目录页
:return:
"""
# 调用发送请求函数
html_data = get_response(html_url).text
# 提取小说名字
name = re.findall('(.*?)
', html_data)[0]
# 提取章节url
url_list = re.findall('- '
, html_data)
return name, url_list
def get_content(html_url):
"""
获取小说内容/小说标题
:param html_url: 小说章节url
:return:
"""
# 调用发送请求函数
html_data = get_response(html_url).text
# 提取标题
title = re.findall('(.*?)
', html_data)[0]
# 提取内容
content = re.findall('(.*?)', html_data, re.S)[0].replace('
', '\n')
return title, content
def save(name, title, content):
"""
保存数据函数
:param name: 小说名
:param title: 章节名
:param content: 内容
:return:
"""
# 自动创建一个文件夹
file = f'{name}\\'
if not os.path.exists(file):
os.mkdir(file)
with open(file + title + '.txt', mode='a', encoding='utf-8') as f:
"""
第一章 标题
小说内容
第二章 标题
小说内容
"""
# 写入内容
f.write(title)
f.write('\n')
f.write(content)
f.write('\n')
print(title, '已经保存')
def main(home_url):
# index_url = 'https://www.biqudu.net' + url
title, content = get_content(html_url=home_url)
save(name, title, content)
if __name__ == '__main__':
url = 'https://www.biqudu.net/1_1631/'
name, url_list = get_list_url(html_url=url)
exe = concurrent.futures.ThreadPoolExecutor(max_workers=7)
for url in url_list:
index_url = 'https://www.biqudu.net' + url
exe.submit(main, index_url)
exe.shutdown()
下载排行所有小说
import requests
import re
import parsel
import os
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
def get_response(html_url):
"""
发送请求函数
:param html_url: 请求链接
:return: response响应对象
"""
# 模拟浏览器 headers 请求头
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'
}
response = requests.get(url=html_url, headers=headers)
return response
def get_list_url(html_url):
"""
获取章节url/小说名
:param html_url: 小说目录页
:return:
"""
# 调用发送请求函数
html_data = get_response(html_url).text
# 提取小说名字
name = re.findall('(.*?)
', html_data)[0]
# 提取章节url
url_list = re.findall('- '
, html_data)
return name, url_list
def get_content(html_url):
"""
获取小说内容/小说标题
:param html_url: 小说章节url
:return:
"""
# 调用发送请求函数
html_data = get_response(html_url).text
# 提取标题
title = re.findall('(.*?)
', html_data)[0]
# 提取内容
content = re.findall('(.*?)', html_data, re.S)[0].replace('
', '\n')
return title, content
def save(name, title, content):
"""
保存数据函数
:param name: 小说名
:param title: 章节名
:param content: 内容
:return:
"""
# 自动创建一个文件夹
file = f'{name}\\'
if not os.path.exists(file):
os.mkdir(file)
with open(file + title + '.txt', mode='a', encoding='utf-8') as f:
"""
第一章 标题
小说内容
第二章 标题
小说内容
"""
# 写入内容
f.write(title)
f.write('\n')
f.write(content)
f.write('\n')
print(title, '已经保存')
def get_novel_id(html_url):
"""
获取小说ID
:param html_url: 某分类的链接
:return:
"""
# 调用发送请求函数
novel_data = get_response(html_url=html_url).text
selector = parsel.Selector(novel_data)
href = selector.css('.l .s2 a::attr(href)').getall()
href = [i.replace('/', '') for i in href]
return href
def main(home_url):
href = get_novel_id(html_url=home_url)
for novel_id in href:
novel_url = f'https://www.biqudu.net/{novel_id}/'
name, url_list = get_list_url(html_url=novel_url)
print(name, url_list)
for url in url_list:
index_url = 'https://www.biqudu.net' + url
title, content = get_content(html_url=index_url)
save(name, title, content)
break
if __name__ == '__main__':
html_url = 'https://www.biqudu.net/biquge_1/'
main(html_url)
小说搜搜功能
# 导入数据请求模块 --> 第三方模块, 需要安装
import requests
# 导入正则表达式模块 --> 内置模块, 不需要安装
import re
# 导入数据解析模块 --> 第三方模块, 需要安装
import parsel
# 导入文件操作模块 --> 内置模块, 不需要安装
import os
# 导入漂亮的表格
import prettytable as pt
def get_response(html_url):
"""
发送请求函数
:param html_url: 请求链接
:return: response响应对象
"""
# 模拟浏览器 headers 请求头
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'
}
response = requests.get(url=html_url, headers=headers)
return response
def get_list_url(html_url):
"""
获取章节url/小说名
:param html_url: 小说目录页
:return:
"""
# 调用发送请求函数
html_data = get_response(html_url).text
# 提取小说名字
name = re.findall('(.*?)
', html_data)[0]
# 提取章节url
url_list = re.findall('- '
, html_data)
return name, url_list
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
def get_content(html_url):
"""
获取小说内容/小说标题
:param html_url: 小说章节url
:return:
"""
# 调用发送请求函数
html_data = get_response(html_url).text
# 提取标题
title = re.findall('(.*?)
', html_data)[0]
# 提取内容
content = re.findall('(.*?)', html_data, re.S)[0].replace('
', '\n')
return title, content
def save(name, title, content):
"""
保存数据函数
:param name: 小说名
:param title: 章节名
:param content: 内容
:return:
"""
# 自动创建一个文件夹
file = f'{name}\\'
if not os.path.exists(file):
os.mkdir(file)
with open(file + name + '.txt', mode='a', encoding='utf-8') as f:
"""
第一章 标题
小说内容
第二章 标题
小说内容
"""
# 写入内容
f.write(title)
f.write('\n')
f.write(content)
f.write('\n')
print(title, '已经保存')
def get_novel_id(html_url):
"""
获取小说ID
:param html_url: 某分类的链接
:return:
"""
# 调用发送请求函数
novel_data = get_response(html_url=html_url).text
selector = parsel.Selector(novel_data)
href = selector.css('.l .s2 a::attr(href)').getall()
href = [i.replace('/', '') for i in href]
return href
def search(word):
"""
搜索功能
:param word: 书名/作者
:return:
"""
search_url = f'https://www.biqudu.net/searchbook.php?keyword={word}'
# 发送请求
search_data = get_response(html_url=search_url).text
# 解析数据, 提取小说名字/作者/小说ID
selector = parsel.Selector(search_data)
lis = selector.css('.novelslist2 li')
novel_info = []
tb = pt.PrettyTable()
tb.field_names = ['序号', '书名', '作者', '书ID']
num = 0
for li in lis[1:]:
# 小说名字
name = li.css('.s2 a::text').get()
novel_id = li.css('.s2 a::attr(href)').get().replace('/', '')
writer = li.css('.s4::text').get()
dit = {
'name': name,
'writer': writer,
'novel_id': novel_id,
}
tb.add_row([num, name, writer, novel_id])
num += 1
novel_info.append(dit)
print('你搜索的结果如下:')
print(tb)
novel_num = input('请输入你想要下载的小说序号: ')
novel_id = novel_info[int(novel_num)]['novel_id']
return novel_id
def main(word):
"""
主函数
"""
novel_id = search(word)
novel_url = f'https://www.biqudu.net/{novel_id}/'
name, url_list = get_list_url(html_url=novel_url)
print(name, url_list)
for url in url_list:
index_url = 'https://www.biqudu.net' + url
title, content = get_content(html_url=index_url)
save(name, title, content)
if __name__ == '__main__':
word = input('请输入你搜索小说名: ')
main(word)
制作GUI界面
导入模块
import tkinter as tk
from tkinter import ttk
def show():
name = name_va.get()
print('输入的名字是:', name)
def download():
name = num_va.get()
print('输入的序号:', name)
创建界面
root = tk.Tk()
设置标题
root.title('小说下载器')
设置界面大小
root.geometry('500x500+200+200')
设置可变变量
name_va = tk.StringVar()
设置标签
search_frame = tk.Frame(root)
search_frame.pack(pady=10)
设置文本
tk.Label(search_frame, text='书名 作者', font=('微软雅黑', 15)).pack(side=tk.LEFT, padx=10)
设置输入框
tk.Entry(search_frame, relief='flat', textvariable=name_va).pack(side=tk.LEFT)
序号获取
num_va = tk.StringVar()
查询下载输入框
'''
python资料获取看这里噢!! 小编 V:Pytho8987(记得好友验证备注:6 否则可能不通过)
即可获取:文章源码/教程/资料/解答等福利,还有不错的视频学习教程和PDF电子书!
'''
download_frame = tk.Frame(root)
download_frame.pack(pady=10)
设置文本
tk.Label(download_frame, text='小说 序号', font=('微软雅黑', 15)).pack(side=tk.LEFT, padx=10)
设置输入框
tk.Entry(download_frame, relief='flat', textvariable=num_va).pack(side=tk.LEFT)
按钮设置
button_frame = tk.Frame(root)
button_frame.pack(pady=10)
设置查询按钮
tk.Button(button_frame, text='查询', font=('微软雅黑', 10), relief='flat', bg='#88e2d6', width=10, command=show).pack(side=tk.LEFT, padx=10)
设置下载按钮
tk.Button(button_frame, text='下载', font=('微软雅黑', 10), relief='flat', bg='#88e2d6', width=10, command=download).pack(side=tk.LEFT, padx=10)
提前设置标签名字和中文显示内容
columns = ('num', 'writer', 'name', 'novel_id')
columns_value = ('序号', '作者', '书名', '书ID')
tree_view = ttk.Treeview(root, height=18, show='headings', columns=columns)
设置列名
tree_view.column('num', width=40, anchor='center')
tree_view.column('writer', width=40, anchor='center')
tree_view.column('name', width=40, anchor='center')
tree_view.column('novel_id', width=40, anchor='center')
给列名设置显示的名字
tree_view.heading('num', text='序号')
tree_view.heading('writer', text='作者')
tree_view.heading('name', text='书名')
tree_view.heading('novel_id', text='书ID')
tree_view.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
展示界面
root.mainloop()
尾语
感谢你观看我的文章呐~本次航班到这里就结束啦
希望本篇文章有对你带来帮助 ,有学习到一点知识~
躲起来的星星也在努力发光,你也要努力加油(让我们一起努力叭)。
最后,宣传一下呀~更多源码、资料、素材、解答、交流皆点击下方名片获取呀