当前位置: 首页 > news >正文

Python编写GUI界面案例:实现免费下载器

前言

嗨喽~大家好呀,这里是魔王呐 ❤ ~!

本次网站:

本文所有模块\环境\源码\教程皆可点击文章下方名片获取此处跳转

开发环境:

  • python 3.8 运行代码

  • pycharm 2022.3 辅助敲代码

模块使用:

  • import parsel >>> pip install parsel

  • import requests >>> pip install requests

如何安装python第三方模块:

  1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车

  2. 在pycharm中点击Terminal(终端) 输入安装命令

思路

一、数据来源分析

  1. 明确需求:

    采集的网站是什么?

    采集的数据是什么?

    标题/内容

  2. 分析 标题/内容 是从哪里来的

    通过浏览器自带工具: 开发者工具抓包分析

    打开开发者工具: F12 / 鼠标右键点击检查选择network

    刷新网页

    搜索数据, 找到数据包

二. 代码实现

  1. 发送请求, 模拟浏览器对于url地址发送请求

  2. 获取数据, 获取服务器返回响应数据内容

    开发者工具: response

  3. 解析数据, 提取我们想要的数据内容

    标题/内容

  4. 保存数据, 把数据保存本地文件

代码实现

有个视频教程给大家录好啦,但是C站放不上来

源码资料电子书: 点击此处跳转文末名片获取

一、单章小说下载

  • 发送请求

  • 获取数据

import requests
url = '网站链接'
headers = {'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=url, headers=headers)
print(response)
# print(response.text)
  • 解析数据
import re 
import parsel 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)
  • 保存数据
with open(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 oslist_url = ''
headers = {'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('<h1>(.*?)</h1>', html_data)[0]
file = f'{name}\\'
if not os.path.exists(file):os.mkdir(file)url_list = re.findall('<dd> <a style="" href="(.*?)">', html_data)
for url in url_list:index_url = '网址' + urlprint(index_url)headers = {'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)selector = parsel.Selector(response.text)title = selector.xpath('//*[@class="bookname"]/h1/text()').get()content = '\n'.join(selector.xpath('//*[@id="content"]/text()').getall())print(title)
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
def get_response(html_url):
"""
发送请求函数
:param html_url: 请求链接
:return: response响应对象
"""
headers = {'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('<h1>(.*?)</h1>', html_data)[0]
url_list = re.findall('<dd> <a style="" href="(.*?)">', 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('<h1>(.*?)</h1>', html_data)[0]
content = re.findall('<div id="content">(.*?)<p>', html_data, re.S)[0].replace('<br/><br/>', '\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):title, content = get_content(html_url=home_url)save(name, title, content)if __name__ == '__main__':url = ''name, url_list = get_list_url(html_url=url)exe = concurrent.futures.ThreadPoolExecutor(max_workers=7)for url in url_list:index_url = '网址' + urlexe.submit(main, index_url)exe.shutdown()

四、采集排行榜所有小说

import requests
import re
import parsel
import os
def get_response(html_url):
"""
发送请求函数
:param html_url: 请求链接
:return: response响应对象
"""
headers = {'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).textname = re.findall('<h1>(.*?)</h1>', html_data)[0]url_list = re.findall('<dd> <a style="" href="(.*?)">', html_data)return name, url_listdef get_content(html_url):
"""
获取小说内容/小说标题
:param html_url: 小说章节url
:return:
"""
html_data = get_response(html_url).text
title = re.findall('<h1>(.*?)</h1>', html_data)[0]
content = re.findall('<div id="content">(.*?)<p>', html_data, re.S)[0].replace('<br/><br/>', '\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, '已经保存')
"""
获取小说ID
:param html_url: 某分类的链接
:return:
"""
def get_novel_id(html_url):novel_data = get_response(html_url=html_url).textselector = parsel.Selector(novel_data)href = selector.css('.l .s2 a::attr(href)').getall()href = [i.replace('/', '') for i in href]return hrefdef main(home_url):href = get_novel_id(html_url=home_url)for novel_id in href:novel_url = f'网址/{novel_id}/'name, url_list = get_list_url(html_url=novel_url)print(name, url_list)for url in url_list:index_url = '' + urltitle, content = get_content(html_url=index_url)save(name, title, content)breakif __name__ == '__main__':html_url = ''main(html_url)

五、搜索小说功能

  • 模块
import requests
import re
import parsel
import os
import prettytable as pt
  • 发送请求函数
def get_response(html_url):headers = {'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
  • 获取章节url/小说名
def get_list_url(html_url):html_data = get_response(html_url).textname = re.findall('<h1>(.*?)</h1>', html_data)[0]url_list = re.findall('<dd> <a style="" href="(.*?)">', html_data)return name, url_list
  • 获取小说内容/小说标题
def get_content(html_url):html_data = get_response(html_url).texttitle = re.findall('<h1>(.*?)</h1>', html_data)[0]content = re.findall('<div id="content">(.*?)<p>', html_data, re.S)[0].replace('<br/><br/>', '\n')return title, content
  • 保存数据函数
def save(name, title, content):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, '已经保存')
  • 获取小说ID
def get_novel_id(html_url):novel_data = get_response(html_url=html_url).textselector = 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):search_url = f'网址/searchbook.php?keyword={word}'search_data = get_response(html_url=search_url).textselector = parsel.Selector(search_data)lis = selector.css('.novelslist2 li')novel_info = []tb = pt.PrettyTable()tb.field_names = ['序号', '书名', '作者', '书ID']num = 0for 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 += 1novel_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'网址/{novel_id}/'name, url_list = get_list_url(html_url=novel_url)print(name, url_list)for url in url_list:index_url = '网址' + urltitle, 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 ttkdef show():name = name_va.get()print('输入的名字是:', name)def download():name = num_va.get()print('输入的序号:', name)root = tk.Tk()
root.title('完整代码添加VX:python5180 ')
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()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()

效果展示

尾语 💝

要成功,先发疯,下定决心往前冲!

学习是需要长期坚持的,一步一个脚印地走向未来!

未来的你一定会感谢今天学习的你。

—— 心灵鸡汤

本文章到这里就结束啦~感兴趣的小伙伴可以复制代码去试试哦 😝

👇问题解答 · 源码获取 · 技术交流 · 抱团学习请联系👇

相关文章:

Python编写GUI界面案例:实现免费下载器

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 本次网站&#xff1a; 本文所有模块\环境\源码\教程皆可点击文章下方名片获取此处跳转 开发环境: python 3.8 运行代码 pycharm 2022.3 辅助敲代码 模块使用&#xff1a; import parsel >>> pip install parsel…...

我的 System Verilog 学习记录(6)

引言 本文简单介绍 SystemVerilog 语言的 线程。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08;1&#xff09; 我的 System Verilog 学习记录&#xff08;2&#xff09; 我的 System Verilog 学习记录&#xff08;3&#xff09; 我的 System Verilog 学…...

SAP 常见问题大全及问题解决大全

1.A:在公司代码分配折旧表时报错? 在公司代码分配折旧表时报错&#xff0c;提示是“3000 的公司代码分录不完全&#xff0d;参见长文本” 希望各位大侠帮我看看。 3000 的公司代码分录不完全&#xff0d;参见长文本 R: a.你把零进项税的代码分配给这个公司代码就可以了 …...

10.Quartz实现定时打分 热帖排行

1.Spring Quartz(1)简介核心组件scheduler 接口&#xff1a;核心调度工具&#xff0c;所有任务由这一接口调用job&#xff1a;定义任务&#xff0c;重写execute方法JobDetail接口&#xff1a;配置描述Trigger接口&#xff1a;什么时候运行&#xff0c;以什么样的频率运行(2)Spr…...

pandas 读取Excel 批量转换时间戳

一、安装 pip install pandas 如果出报错&#xff0c;不能运行&#xff0c;可以安装 pip install xlrd 二、 代码如下 import pandas as pd import time,datetimefile_path rC:\Users\Administrator\Desktop\携号转网测试\admin_log.xls df pd.read_excel(file_path, sheet_n…...

绕过检测之Executor内存马浅析(内存马系列篇五)

写在前面 前面已经从代码层面讲解了Tomcat的架构&#xff0c;这是内存马系列文章的第五篇&#xff0c;带来的是Tomcat Executor类型的内存马实现。有了前面第四篇中的了解&#xff0c;才能更好的看懂内存马的构造。 前置 什么是Executor Executor是一种可以在Tomcat组件之间…...

《C++模板进阶》

致前行的人&#xff1a; 要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累都需要过程&#xff01; 目录 前言&#xff1a; 1.非类型模板参数 1.1.概念&#xff1a; 1.2.使用注意事项 2.模板特化 2.1函数模板特化 2.2类模板特化 3.模板的分离编译 3.1什么…...

【项目管理】项目进度管理中的逻辑关系

项目的进度管理是项目核心管理之一&#xff0c;通过合理的进度安排&#xff0c;制定出科学可行的分项工期表&#xff0c;并条理清晰的显示出项目进度之间的逻辑关系。 1、目标是计划的灵魂 进度计划必须按照确定的项目总进度要求进行编制&#xff0c;了解项目总目标和整体安…...

ARM的汇编指令集

一、汇编指令 1.1 指令与伪指令 汇编的指令 指令是CPU机器指令的助记符&#xff0c;编译后会得到一串二进制机器码&#xff0c;由CPU执行 汇编的伪指令 伪指令本质上不是指令&#xff0c;它是编译器环境提供用来指导编译过程&#xff0c;编译后伪指令不会生成机器码 伪指令…...

@font-face用法超详细讲解

文章目录font-face是什么font-face基本语法urlTTFOTFEOTWOFFSVGformatfont-face用法示例font字体下载ttf-to-eot 字体转换器https://blog.csdn.net/qq_37417446/article/details/106728725 https://developer.mozilla.org/zh-CN/docs/Web/CSS/font-face font-face是什么 font-…...

[oeasy]python0095_乔布斯求职_雅达利_atari_breakout_打砖块_布什内尔_游戏机_Jobs

编码进化 回忆上次内容 上次 我们回顾了 电子游戏的历史 从 电子游戏鼻祖 双人网球到 视频游戏 PingPong再到 街机游戏 Pong 雅达利 公司 来了 嬉皮士 捣乱&#xff1f;&#x1f914; 布什内尔 会如何 应对 呢&#xff1f;&#x1f914; 布什内尔 布什内尔 本身就有点 …...

全景极简印度史

转自&#xff1a;印度简史 - 知乎 (zhihu.com)印度是世界上最早出现文明的地区之一&#xff0c;印度河是其文明的发源地。古印度文明的疆域曾包括今印度共和国、巴基斯坦、孟加拉国、阿富汗斯坦南部部分地区和尼泊尔。史前时代200万年前&#xff0c;巴基斯坦北部的希瓦利克遗址…...

《设计模式》模板方法

《设计模式》模板方法 模板方法是一种行为型设计模式&#xff0c;用于定义一个算法的框架&#xff0c;而将一些步骤的实现留给子类来完成。模板方法在基类中定义了一个模板方法&#xff0c;该方法确定了算法的基本结构&#xff0c;然后将一些步骤的实现交给子类去完成。这个模…...

Linux环境内存管理——链表

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Windows程序员如何学习Linux环境内存管理。由于很多程序在Windows环境下开发好后&#xff0c;还要部署到Linux服务器上去&#xff0c;所以作为Windows程序员有必要学习Linux环境的内存…...

String、StringBuffer、StringBuilder类

String类 由多个字符组成的一串数据,值一旦创建不可改变 private final char value[]; 一旦值改变,就会创建新的对象 String s "abc"; //char[] c {a,b,c}s"def"; // 并不是String的值改变,而是创建了一个新的对象s"gh";s"aaa"…...

在VScode中添加Linux中的Docker容器中的Python解释器

VScode编辑器在安装好Python插件之后会自动选择环境变量中排序最高的那一个解释器作为默认解释器&#xff0c;而想要额外添加新的Python解释器就需要自己设置。 VScode编辑器安装在本地电脑 支持Python的docker安装在远程服务器 第一步&#xff0c;在/usr/local/下新建pytho…...

无法将“django-admin”项识别为cmdlet,函数,脚本文件或可运行程序的名称问题

无法将“django admin”项识别为cmdlet&#xff0c;函数&#xff0c;脚本文件或可运行程序的名称问题 小提示&#xff1a;首先检查一下有没有拼写错误&#xff01;&#xff01;&#xff01;没有的话请继续 我们要知道django装到哪里去了 pip show django 注意&#xff1a;3.0…...

乐友商城学习笔记(十五)

无状态登陆原理 在服务器端保存session 无状态不需要session&#xff0c;把登陆状态保存在cookie中 jwtrsa token&#xff1a;登陆时&#xff0c; jwt oath2 jwt&#xff1a;头信息&#xff08;jwt&#xff09; 载荷&#xff08;用户信息&#xff0c;签发人&#xff0c;签发时…...

目标检测论文阅读:CBNet算法笔记

标题&#xff1a;CBNet: A Composite Backbone Network Architecture for Object Detection 期刊&#xff1a;TIP2022 论文地址&#xff1a;https://ieeexplore.ieee.org/document/9932281/ 官方代码&#xff1a;https://github.com/VDIGPKU/CBNetV2 作者单位&#xff1a;北京大…...

vue前端与Java后端进行跨域交互

1.后端的几种解决方法 1.在Controller上面加上CrossOrigin 2.写一个配置文件并且在Controller层加上注解CORSConfig package com.wolwo.langyage.base.util;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configurat…...

颠覆PDF转换体验:Marker无缝实现25页/秒全场景文档格式精准迁移

颠覆PDF转换体验&#xff1a;Marker无缝实现25页/秒全场景文档格式精准迁移 【免费下载链接】marker 一个高效、准确的工具&#xff0c;能够将 PDF 和图像快速转换为 Markdown、JSON 和 HTML 格式&#xff0c;支持多语言和复杂布局处理&#xff0c;可选集成 LLM 提升精度&#…...

OpCore-Simplify:终极OpenCore EFI配置自动化解决方案

OpCore-Simplify&#xff1a;终极OpenCore EFI配置自动化解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而烦恼吗&am…...

手把手教你用STM32F103驱动ST7565R芯片的JLX12864G屏幕(附取模工具配置)

STM32F103驱动ST7565R液晶屏的深度开发指南 在嵌入式显示领域&#xff0c;128x64分辨率的单色液晶屏因其性价比高、接口简单而广受欢迎。本文将深入探讨基于STM32F103微控制器驱动ST7565R芯片的JLX12864G液晶屏的完整技术方案&#xff0c;从硬件连接到高级显示功能的实现&#…...

OpenAI Triton项目中的相关技术对比:多面体编译与调度语言

OpenAI Triton项目中的相关技术对比&#xff1a;多面体编译与调度语言 【免费下载链接】triton Development repository for the Triton language and compiler 项目地址: https://gitcode.com/GitHub_Trending/tri/triton 引言 在深度学习编译器领域&#xff0c;OpenA…...

探索Unity全功能的开源方案:UniHacker跨平台功能扩展工具深度指南

探索Unity全功能的开源方案&#xff1a;UniHacker跨平台功能扩展工具深度指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker Unity作为游戏开发领域的行业标…...

白城腾讯广告服务商

在白城&#xff0c;有不少企业想借助腾讯广告拓展业务&#xff0c;这就离不开靠谱的腾讯广告服务商。今天就和大家聊聊白城腾讯广告服务商的那些事儿&#xff0c;长春中网互联技术在这一领域表现就相当不错。白城腾讯广告服务商现状行业报告显示&#xff0c;近几年白城地区对腾…...

Win11Debloat:终极Windows系统清理工具,一键提升电脑性能的完整指南

Win11Debloat&#xff1a;终极Windows系统清理工具&#xff0c;一键提升电脑性能的完整指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执…...

手把手教你为i.MX6ULL开发板适配非标准分辨率LCD(以1024x600 OV5640为例)

i.MX6ULL开发板非标准分辨率LCD适配实战&#xff1a;从寄存器配置到图像稳定输出 在嵌入式视觉系统开发中&#xff0c;摄像头与显示设备的适配往往成为项目落地的关键瓶颈。当面对非标准分辨率的LCD屏幕时&#xff0c;开发者需要深入理解图像采集与显示的全链路原理&#xff0c…...

分布式电池管理系统:基于微控制器架构的智能电池保护与均衡解决方案

分布式电池管理系统&#xff1a;基于微控制器架构的智能电池保护与均衡解决方案 【免费下载链接】SmartBMS Open source Smart Battery Management System 项目地址: https://gitcode.com/gh_mirrors/smar/SmartBMS SmartBMS是一个开源的智能电池管理系统&#xff0c;专…...

Matlab GUI 计时器:基于定时器对象自动更新的数字时钟演示

Matlab图形用户界面计时器&#xff1a;使用定时器对象自动更新的MatlabGUI&#xff0c;一个数字时钟&#xff0c;作为显示基本组件的快速演示&#xff0c;带有一个按钮&#xff0c;用于恢复/暂停执行更新实验室配了新酶标仪孵箱但总有人&#xff08;比如同组摸鱼的小师妹顺便喊…...