全网小说下载器,只需书名,一键下载(Python爬虫+tkinter 实现)小白实战案例系统教学!

news2024/11/25 6:43:54

大家好,我是小曼呐
在这里插入图片描述

前言

ttkbootstrap是一个基于Python的开源库,用于创建漂亮且交互式的GUI应用程序。它是在Tkinter框架之上构建的,提供了一系列的Widget组件和样式,可以帮助开发者快速构建现代化的用户界面。

今天做的是这个东西,蓝色的是进度条
在这里插入图片描述

获取数据代码(附上代码)

def get_response(html):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    }
    response = requests.get(url=html, headers=headers)
    return response
源码、解答、教程、安装包等资料加V:xiaoyuanllsll 发送验证时记得备注 “M”噢 

def search(key):
    search_url = f'https://www.xzmncy.com/api/search?q={key}'
    search_data = get_response(search_url).json()
    search_info = []
    num = 1
    for index in search_data['data']['search']:
        dit = {
            'num': num,
            'name': index['book_name'],
            'author': index['author'],
            'book': index['book_list_url'].split('/')[-2],
        }
        search_info.append(dit)
        num += 1
    return search_info


def get_info(book):
    link = f'https://www.xzmncy.com/list/{book}/'
    link_data = get_response(link).text
    link_selector = parsel.Selector(link_data)
    href = link_selector.css('#list dd a::attr(href)').getall()
    href = ['https://www.xzmncy.com' + i for i in href]
    return href


def get_content(html):
    html_data = get_response(html).text
    selector = parsel.Selector(html_data)
    title = selector.css('.bookname  h1::text').get()
    content_list = selector.css('#htmlContent p::text').getall()
    content = '\n'.join(content_list)
    return title, 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')

界面显示

所需模块

import ttkbootstrap as ttk
from PIL import ImageTk, Image
from download import *
from ttkbootstrap.dialogs import Messagebox

实例化创建应用程序窗口

root = ttk.Window(
    title="小说下载器",  # 设置窗口的标题
    themename="litera",  # 设置主题
    size=(470, 520),  # 窗口的大小
    position=(100, 100),  # 窗口所在的位置
    minsize=(0, 0),  # 窗口的最小宽高
    maxsize=(1920, 1080),  # 窗口的最大宽高
    resizable=None,  # 设置窗口是否可以更改大小
    alpha=1.0,  # 设置窗口的透明度(0.0完全透明)
)

ico = ImageTk.PhotoImage(Image.open("python.ico"))
root.iconphoto(False, ico)
root.place_window_center()    #让显现出的窗口居中
root.resizable(False, False)  # 让窗口不可更改大小


root.mainloop()

在这里插入图片描述

搜索框

image = Image.open("img\\123123.png")
photo = ImageTk.PhotoImage(image)
ttk.Label(root, image=photo).pack()
key_input_frame = ttk.Frame()
key_input_frame.pack(pady=10)
key_input_key_va = ttk.StringVar()
ttk.Label(key_input_frame, text='小说 | 作者', font=('微软雅黑', 12)).pack(side=ttk.LEFT)
ttk.Entry(key_input_frame, textvariable=key_input_key_va, font=('微软雅黑', 12)).pack(side=ttk.LEFT, padx=10,fill=ttk.BOTH)
num_input_frame = ttk.Frame()
num_input_frame.pack(pady=10)
num_input_key_va = ttk.StringVar()
ttk.Label(num_input_frame, text='小说 | 序号', font=('微软雅黑', 12)).pack(side=ttk.LEFT)
ttk.Entry(num_input_frame, textvariable=num_input_key_va, font=('微软雅黑', 12)).pack(side=ttk.LEFT, padx=10,fill=ttk.BOTH)
frame = ttk.Frame()
frame.pack(fill=ttk.BOTH)

在这里插入图片描述

按钮和进度条

ttk.Button(key_input_frame, text='搜索').pack(side=ttk.LEFT)
ttk.Button(num_input_frame, text='下载').pack(side=ttk.LEFT)
progress_bar = ttk.Progressbar(frame, orient='horizontal', length=300, mode='determinate')
progress_bar.pack(pady=20)

在这里插入图片描述

显示搜索到的书名、作者等

# 1. 创建字段
columns = ("num", "name", "author", "book")
columns_value = ('序号', '小说', '作者', '书ID')
# 2. 创建表格对象
tree_view = ttk.Treeview(root, show="headings", columns=columns)
# 3. 给表格添加字段名
tree_view.column('num', width=80, anchor='center')
tree_view.column('name', width=80, anchor='center')
tree_view.column('author', width=80, anchor='center')
tree_view.column('book', width=80, anchor='center')

# 4. 设置字段在页面上显示的内容
tree_view.heading('num', text='序号')
tree_view.heading('name', text='小说')
tree_view.heading('author', text='作者')
tree_view.heading('book', text='书ID')

# 5. 将表格对象布局到页面上
tree_view.pack(fill=ttk.BOTH, expand=True)

在这里插入图片描述
搜索功能设置

def show():
    key = key_input_key_va.get()
    search_info = search(key)
    # 6. 往表格中添加数据
    for index, stu in enumerate(search_info):
        tree_view.insert('', index + 1, values=(
            stu['num'], str(stu['name']), str(stu['author']), str(stu['book'])))

在这里插入图片描述

最后运行效果

在这里插入图片描述

python打造小说下载软件,全网小说一键下载,在线阅读 无水印(附源码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/878455.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript如何执行语句

目录 语法/词法分析 预编译 解释执行 预编译什么时候发生 js运行三步曲 预编译前奏 预编译步骤 巩固基础练习 语法/词法分析 按语句块的粒度解析成抽象语法树 ,分析该js脚本代码块的语法是否正确,如果出现不正确,则向外抛出一个语法错误&#x…

centos7 部署kubernetes(带自动部署脚本)

目录 一、实验规划 1、规划表 2、安装前宿主机检查 1.配置主机名 2.制作ssh免密(VM1中执行) 3.修改hosts 文件 4. 修改内核相关参数 5.加载模块 6. 清空iptables、关闭防火墙、关闭交换空间、禁用selinux 7. 安装ipvs与时钟同步 8.配置docker的…

实现两个table一起滚动的效果

效果 代码 css相关 重点是.head-box .body-box-right .body-box-left 三个类的设置 .box {display: flex;justify-content: flex-start;}table {width: 500px;}tr,th {display: flex;justify-content: space-around;align-content: space-around;height: 50px;}td {width: 8…

Vue 使用 vite 创建项目

vite 是新一代前端构建工具,和 webpack 类似。 vite 的启动速度更快。在开发环境中,不需要打包就可以直接运行。 vite 的更新速度更快。当修改内容后,不需要刷新浏览器,页面就会实时更新。 vite 完全是按需编译。它只会编译需要…

(二分查找) 11. 旋转数组的最小数字 ——【Leetcode每日一题】

❓剑指 Offer 11. 旋转数组的最小数字 难度:简单 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转…

LeetCode 37题:解数独

题目 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 数独…

Docker中MySQL应用部署操作步骤

在linux系统下安装mysql、安装redis是非常麻烦的,但是docker出现后,应用安装会非常简洁。 1.MySQL部署 2.docker中部署mysql的步骤 创建mysql容器 这样mysql就部署好了。 外部机器连接docker中部署的mysql

Python学习笔记_基础篇_初识python

Python简介 python的创始人为吉多范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。 Python和其他语言的对比&#xff…

15个免费的图标素材网站推荐

想象力没有限制。你在寻找下载免费矢量图标网站吗?本文为需要使用各种图标美化网页布局和界面设计,简单提升更好用户体验的设计师提供了15个矢量图标网站。 1.即时设计资源社区 即时设计是国内一款专业级的 UI 设计工具,像 PC 端的网页&…

htmlCSS-----弹性布局

目录 前言 什么是弹性布局 样式 学习概要 容器和项目 弹性布局的排列方式 1.横向排列(默认样式) 2.父元素容器的属性(*5) (1)主轴 代码示例: (2)交叉轴 3.子元素…

资料分析(三)—— 基期、现期、人口、增长量

基期 基期值 现期值 - 增长量 增长量/增长率 现期值/1&#xff08;间隔)增长率 化除为乘 &#xff1a;当增长率&#xff5c;r| < 5% 时&#xff0c;&#xff0c; 注&#xff1a;当选项首位相同&#xff0c;第二位也相同时&#xff0c;只能用直除 基期和差 (结合选…

Android9开机启动与FBE过程完整介绍与LOG流程

一&#xff0c;开机整体流程概述 Init进程作为Android的第一个user space(用户空间)的进程&#xff0c;它是所有 Android 系统 native service 的祖先&#xff0c;它的进程号是 1。 init进程工作分为第一阶段和第二阶段。 二&#xff0c;init fisrt stage 代码参考&#xff…

js操作剪贴板讲解

文章目录 复制&#xff08;剪切&#xff09;到剪贴板Document.execCommand()Clipboard复制Clipboard.writeText()Clipboard.write() copy&#xff0c;cut事件 从剪贴板进行粘贴document.execCommand(paste)Clipboard粘贴Clipboard.readText()Clipboard.read() paste 事件 安全性…

使用docker快速搭建wordpress服务,并指定域名访问

文章目录 引入使用docker快速跑起服务创建数据库安装wordpress服务配置域名 引入 wordpress是一个基于PHP语言编写的开源的内容管理系统&#xff08;CMS&#xff09;&#xff0c;它有丰富的插件和主题&#xff0c;可以非常简单的创建各种类型的网站&#xff0c;包括企业网站、…

云安全攻防(十一)之 容器编排平台面临的风险

前言 容器技术和编排管理是云原生生态的两大核心部分——前者负责执行&#xff0c;后者负责控制和管理&#xff0c;共同构成云原生技术有机体&#xff0c;我们以 Kubernetes 为例&#xff0c;对容器编排平台可能面临的风险进行分析 容器编排平台面临的风险 作为最为流行的云…

LeetCode150道面试经典题-- 快乐数(简单)

1.题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&am…

OpenLayers实战,高德GCJ-02坐标系转WGS-84坐标系

专栏目录: OpenLayers实战进阶专栏目录 前言 本章实现高德GCJ-02坐标系转WGS-84坐标系。日常开发中经常遇到源坐标高德的情况,这时候如果地图不是高德,而是使用的wgs84坐标系的地图,或者其他坐标系的情况下,就会导致位置偏移,本章就是解决高德坐标偏移问题。 二、依赖…

Detecting Twenty-thousand Classes using Image-level Supervision

Detecting Twenty-thousand Classes using Image-level Supervision 摘要背景方法PreliminariesDetic:具有图像类别的检测器loss技术细节扩展Grad-CAMGrad-CAM原理 总结 摘要 摘要 由于检测数据集的规模较小&#xff0c;目前的物体检测器在词汇量方面受到限制。而图像分类器的数…

深入了解Linux运维的重要性与最佳实践

Linux作为开源操作系统的代表&#xff0c;在企业级环境中的应用越来越广泛。而在保障Linux系统的正常运行和管理方面&#xff0c;Linux运维显得尤为关键。本文将介绍Linux运维的重要性以及一些最佳实践&#xff0c;帮助读者更好地了解和掌握Linux系统的运维技巧。 首先&#xf…

【Linux初阶】system V消息队列 + system V信号量

文章目录 一、system V消息队列&#xff08;了解&#xff09;二、system V信号量&#xff08;了解&#xff09;1.信号量是什么2.临界资源和临界区3.互斥4.为什么要信号量 三、IPC资源的组织方式结语 一、system V消息队列&#xff08;了解&#xff09; 消息队列提供了一个从一…