Python 实现试卷下载器:从零开始构建 GUI 应用

在本文中,我们将介绍如何使用 Python 构建一个简单的试卷下载器。该应用程序可以从指定的网站下载试卷,并通过一个图形用户界面(GUI)来进行交互。我们将使用 requests 库进行网络请求,使用 BeautifulSoup 解析 HTML,使用 tkinter 创建 GUI。

注意:本文所示代码仅供学习和交流使用,严禁用于任何商业活动。请文明使用,尊重版权。

环境准备

在开始之前,请确保已经安装了以下库:

pip install requests
pip install beautifulsoup4

完整代码

以下是完整的代码实现:

#!/usr/bin/env python3
# coding:utf-8
import os
import requests
from bs4 import BeautifulSoup
import tkinter as tk
from tkinter import ttk, filedialog, messageboxdef fetch_page_count(url):response = requests.get(url)response.encoding = "gb2312"soup = BeautifulSoup(response.text, "html.parser")page = soup.find("ul", class_="pagelist")count = int(page.find("strong").string)base_url = page.find("a").get("href").rsplit("_", 1)[0]return count, base_urldef download_test_papers(page_url, version, save_path, base_url, progress, total_papers):response = requests.get(page_url)response.encoding = "gb2312"soup = BeautifulSoup(response.text, "html.parser")test_list = soup.find("ul", class_="c1")test_trs = test_list.find_all("tr")downloaded = 0for tr in test_trs:if version in tr.text:test_td = tr.find("a").get("href")name = tr.find("a").stringtest_url = base_url + test_tdtest_page = requests.get(test_url)test_page_soup = BeautifulSoup(test_page.text, "html.parser")downurl = test_page_soup.find("ul", class_="downurllist").find("a").get("href")download_file(base_url + downurl, os.path.join(save_path, name + ".rar"))downloaded += 1progress.set(downloaded)root.update_idletasks()if downloaded >= total_papers:returndef download_file(url, path):response = requests.get(url)with open(path, "wb") as file:file.write(response.content)def start_download():subject = subject_var.get()grade = grade_var.get()version = version_var.get()save_path = path_entry.get()total_papers = int(papers_var.get())if not subject or not grade or not version or not save_path or not total_papers:messagebox.showerror("错误", "所有字段都必须填写!")returnurl = base_url + subjects[subject] + grades[grade]try:page_count, page_base_url = fetch_page_count(url)except Exception as e:messagebox.showerror("错误", f"获取页面数据失败: {e}")returnif not os.path.exists(save_path):os.makedirs(save_path)try:progress.set(0)total_progress['maximum'] = total_papersfor page in range(1, page_count + 1):page_url = f"{url}/{page_base_url}_{page}.html"download_test_papers(page_url, version, save_path, base_url, progress, total_papers)if progress.get() >= total_papers:breakmessagebox.showinfo("完成", "所有试卷下载完成!")except Exception as e:messagebox.showerror("错误", f"下载过程中出错: {e}")def browse_path():path = filedialog.askdirectory()if path:path_entry.delete(0, tk.END)path_entry.insert(0, path)if __name__ == '__main__':base_url = "https://www.shijuan1.com"subjects = {"语文": "/a/sjyw", "数学": "/a/sjsx", "英语": "/a/sjyy", "物理": "/a/sjwl","化学": "/a/sjhx", "政治": "/a/sjzz", "历史": "/a/sjls", "地理": "/a/sjdl", "生物": "/a/sjsw"}grades = {"一年级": "1", "二年级": "2", "三年级": "3", "四年级": "4", "五年级": "5", "六年级": "6","七年级": "7", "八年级": "8", "九年级": "9", "中考": "zk", "高一": "g1", "高二": "g2", "高三": "g3","高考": "gk"}versions = ["人教版", "苏教版", "北师大版", "沪教版", "鲁教版", "其他"]# 创建主窗口root = tk.Tk()root.title("试卷下载器")# 科目选择tk.Label(root, text="科目:").grid(row=0, column=0, padx=10, pady=10)subject_var = tk.StringVar()subject_combobox = ttk.Combobox(root, textvariable=subject_var, values=list(subjects.keys()))subject_combobox.grid(row=0, column=1, padx=10, pady=10)# 年级选择tk.Label(root, text="年级:").grid(row=1, column=0, padx=10, pady=10)grade_var = tk.StringVar()grade_combobox = ttk.Combobox(root, textvariable=grade_var, values=list(grades.keys()))grade_combobox.grid(row=1, column=1, padx=10, pady=10)# 版本信息选择tk.Label(root, text="版本信息:").grid(row=2, column=0, padx=10, pady=10)version_var = tk.StringVar()version_combobox = ttk.Combobox(root, textvariable=version_var, values=versions)version_combobox.grid(row=2, column=1, padx=10, pady=10)# 保存路径选择tk.Label(root, text="保存路径:").grid(row=3, column=0, padx=10, pady=10)path_entry = tk.Entry(root)path_entry.grid(row=3, column=1, padx=10, pady=10)tk.Button(root, text="浏览...", command=browse_path).grid(row=3, column=2, padx=10, pady=10)# 下载份数选择tk.Label(root, text="下载份数:").grid(row=4, column=0, padx=10, pady=10)papers_var = tk.StringVar(value="10")papers_entry = tk.Entry(root, textvariable=papers_var)papers_entry.grid(row=4, column=1, padx=10, pady=10)# 进度条progress = tk.IntVar()total_progress = ttk.Progressbar(root, variable=progress, maximum=100)total_progress.grid(row=5, column=0, columnspan=3, padx=10, pady=10, sticky="ew")# 开始下载按钮tk.Button(root, text="开始下载", command=start_download).grid(row=6, column=0, columnspan=3, padx=10, pady=20)# 运行主循环root.mainloop()

代码解析

  1. 库导入和网络请求

    • 使用 requests 库进行网络请求。
    • 使用 BeautifulSoup 解析 HTML。
    • 使用 tkinter 创建 GUI。
  2. 函数定义

    • fetch_page_count(url):获取页面数量和基础 URL。
    • download_test_papers(page_url, version, save_path, base_url, progress, total_papers):下载试卷。
    • download_file(url, path):下载文件并保存到指定路径。
    • start_download():开始下载的主逻辑。
    • browse_path():浏览文件夹路径。
  3. 主程序

    • 创建 GUI,并设置各类控件:下拉框、文本框、按钮等。
    • 使用 tkinter 的 mainloop 运行主循环。

使用说明

  1. 选择科目:从下拉框中选择需要下载试卷的科目。
  2. 选择年级:从下拉框中选择年级。
  3. 选择版本:从下拉框中选择试卷版本。
  4. 选择保存路径:点击“浏览”按钮,选择下载文件保存路径。
  5. 输入下载份数:在文本框中输入需要下载的试卷份数。
  6. 开始下载:点击“开始下载”按钮,程序将自动开始下载试卷。

注意事项

  • 网络连接:确保网络连接正常,避免下载过程中断。
  • 下载路径:确保选择的下载路径有足够的存储空间。
  • 文明使用:本程序仅供学习交流使用,严禁用于任何商业活动。

希望本文能对你有所帮助,带你一步步实现一个简单的试卷下载器。欢迎在评论区分享你的使用心得或提出问题!

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

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

相关文章

C语言使用正则表达式

C语言使用正则表达式 1. 导入头文件2. 编译正则表达式3. 执行正则表达式4. 释放正则表达式完整示例说明 在C语言中,可以使用POSIX正则表达式库来匹配正则表达式。POSIX正则表达式库提供了标准的正则表达式处理函数,例如 regcomp, regexec, 和 regfree…

iso21434认证的意义

ISO 21434认证对于汽车行业具有深远的意义,主要体现在以下几个方面: 确保汽车网络安全:ISO 21434认证旨在确保汽车在设计和制造过程中能够抵御潜在的网络威胁和攻击。通过遵循该标准,汽车制造商能够开发出具备可靠网络安全能力的…

Linux系统防火墙iptables(下)

备份与还原iptables规则设置 1、yum -y install iptables iptables-services 安装iptables软件包 2、systemctl start iptables.service 开启服务 3、systemctl enable iptables.service 开机自启 我们对iptables命令行中的设置,都是临时设置,只要遇到服…

GPT-5

欢迎来到 Papicatch的博客 文章目录 🍉技术突破预测 🍈算法进步 🍈理解力提升 🍈行业推动力 🍉人机协作的未来 🍈辅助决策 🍈增强创造力 🍈复杂任务中的角色 🍈人…

深入剖析Tomcat(十三) Host、Engine 容器

前面很多篇文章都在介绍Context与Wrapper两个容器,因为这两个容器确实也比较重要,与我们日常开发也息息相关,但是Catalina是存在四个容器的,这一章就来简单看看Host与Engine这两个容器。 再次展示下Catalina的容器结构&#xff0…

VS2022(Visual Studio 2022)最新安装教程

1、下载 1、下载地址 - 官网地址:下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux - 根据自己的电脑的 【操作系统】 灵活选择。 2、安装包 【此处为Windows系统安装包】 2、安装 1、打开软件 - 右击【以管理员身份打开】, 2、准备配置 …

Web Serial串口通信实现WEB浏览器读写M1卡

本示例使用的设备&#xff1a;RS232串口RFID NFC IC卡读写器可二次开发编程发卡器USB转COM-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &l…

前端面试题-token的存放位置

哈喽小伙伴们大家好,本系列是一个专门针对前端开发岗的面试题系列,每周将会不定期分享一些面试题,希望对大家有所帮助. 面试官:token 一般在客户端存在哪儿 求职者:Token一般在客户端存在以下几个地方&#xff1a; (1)Cookie&#xff1a;Token可以存储在客户端的Cookie中。服…

61.应交税费的明细科目-待转销项税额

目录 1.变化 2.定义 3.科目设置的目的 4.会计处理 5.会计分录 1.变化 财会2016年22号文--《增值税会计处理规定》中对于应交税费的会计处理有了重大变化&#xff0c;引入了“待转销项税额”这一二级明细科目来核算一般纳税人销售货物、加工修理修配劳务、服务、无形资产…

优思学院|工厂的部门架构管理与精益生产

工厂内有不同部门&#xff0c;各部门之间必须协调合作才能发挥整体功能。工厂最主要的部分是制造产品的现场&#xff0c;这里安装了生产工具&#xff0c;还有操作员进行加工或生产制造。 制造时使用的材料或零组件&#xff0c;需要对外采购。对于加工组装型的工厂&#xff0c;…

短视频利器 ffmpeg (1)

使用FFmpeg切片视频有多种好处&#xff0c;尤其是在处理流媒体内容和优化视频分发时。以下是一些主要优点&#xff1a; 提高流媒体性能&#xff1a; 1、快速启动&#xff1a; 切片允许客户端更快地开始播放视频&#xff0c;因为它不需要等待整个文件下载完毕。客户端可以请求…

基于Boost和平均电流控制方法的APFC电路设计

通过学习无线充电相关知识&#xff0c;为更快熟悉APFC工作原理&#xff0c;通过实验得以掌握 技术要求&#xff1a; 1&#xff09;输入电压&#xff1a;AC 85V&#xff5e;265V&#xff1b; 2&#xff09;输出电压&#xff1a;400V1%&#xff1b; 3&#xff09;输出额定电流…

AI推介-信息抽取(information extraction,IE)论文速览(arXiv方向):2024.04.15-2024.06.01

文章目录~ 1.GAMedX: Generative AI-based Medical Entity Data Extractor Using Large Language Models2.Retrieval Augmented Structured Generation: Business Document Information Extraction As Tool Use3.BioBERT-based Deep Learning and Merged ChemProt-DrugProt for…

音视频开发30 FFmpeg 视频编码- 流程以及重要API,H264编码原理说明,该章节使用h264编码说明

一.H264编码原理 1 视频为什么需要进行编码压缩 ◼ 一张为 720x480 的图像&#xff0c;用 YUV420P 的格式来表示&#xff0c;其大小为&#xff1a; 720*480*1.5 约等于 0.5MB 。 ◼ 如果是 25 帧&#xff0c; 10 分钟的数据量 0.5M*10*60*25 7500MB -> 7GB 多 ◼ …

自学网络安全的三个必经阶段(含路线图)

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…

blender 快捷键 常见问题

一、快捷键 平移视图&#xff1a;Shift 鼠标中键旋转视图&#xff1a;鼠标中键缩放视图&#xff1a;鼠标滚动框选放大模型&#xff1a;Shift B线框预览和材质预览切换&#xff1a;Shift Z 二、常见问题 问题&#xff1a;导入模型成功&#xff0c;但是场景中看不到。 解…

电路与数字逻辑期末复习重点整理!!

1.带无关项的卡诺图 2.置数法设计N进制电路 计数器&#xff1a;具有记忆输入脉冲个数功能的电路称为计数器。 按照各个触发器状态更新情况的不同可分为&#xff1a; 同步计数器&#xff1a;各触发器受同一时钟脉冲─输入计数脉冲控制&#xff0c;同步更新状态。异步计数器&a…

阿里云centos 7.9 使用宝塔面板部署.netcore 6.0

前言&#xff1a; 我有一个netcore6.0的系统接口和手机端程序的站点程序之前是部署在一台windows测试服务器的IIS站点中&#xff0c; 服务器最近压力太大扛不住了&#xff0c;买了一台centos7.9的阿里云服务器准备进行迁移。具体操作日记如下。 一、安装宝塔面板 这一步涉及…

堡垒机软件详细定义以及部分厂商汇总

随着大家对网络安全的重视&#xff0c;越来越多的企业开始采购堡垒机。堡垒机可以分为硬件堡垒机、软件堡垒机、软硬一体机。今天我们就来聊聊堡垒机软件详细定义以及部分厂商汇总。 堡垒机软件详细定义 堡垒机软件&#xff0c;又称为运维安全审计系统&#xff0c;其主要功能在…

顺序表--数据结构第一关

顺序表 数据结构概念 定义&#xff1a;数据结构是计算机存储、组织数据的⽅式 根据学过C语言的基础上&#xff0c;数组是最简单的数据结构 顺序表的底层就是数组 为什么呢&#xff1f; 例子如下&#xff1a; int arr[100]{1,2,3,4,5}; //修改某一个数据&#xff1a;arr[…