带图形界面的古诗词爬虫工具:一键抓取+中文文本清洗
本文还有配套的精品资源点击获取简介这个Python小项目能直接运行打开就用不用改代码也能跑起来。主程序通过PyQt5搭了个简洁的桌面窗口点几下按钮就能启动爬虫目标是古诗词名句类网站比如‘shicimingju_spider-main’目录里预设的源站。爬下来的内容自动存成a.txt格式清晰方便后续处理。内置了常用中文停用词表cn_stopwords.txt在spider.py里做了基础文本清洗去掉‘的’‘了’‘在’这类无意义词让结果更干净。ui.py和ui.ui配合生成界面main.py是总入口所有逻辑模块分工明确。依赖只有requests、beautifulsoup4和PyQt5Python 3.6以上就能跑requirements.txt里列全了pip install -r 一行搞定。README.md写清楚了怎么装环境、怎么点开运行、每部分干啥特别适合学生交Python课设或爬虫实训作业不折腾配置重点放在理解流程和动手实践上。1. 项目概述为什么一个“古诗词爬虫图形界面”能成为课设里的高分答案你有没有遇到过这样的情况Python爬虫课设布置下来老师说“选个网站练手”结果你吭哧吭哧写完命令行脚本运行时得敲python spider.py --keyword 李白 --pages 5同学一问“怎么启动”你得翻出终端截图、解释参数含义、还得提醒他别忘了装requests……最后交作业时助教点开你的压缩包看到一堆.py文件和一行行命令第一反应是“这玩意儿真能跑起来吗”——不是代码不行是交付形态没到位。这个“带图形界面的古诗词爬虫工具”本质上解决的不是一个技术难题而是一个教学场景下的体验断层问题。它把“爬虫逻辑”、“文本处理”、“用户交互”三个模块用最轻量、最直观、最符合学生认知习惯的方式缝合在一起你不需要知道XPath怎么写不用查BeautifulSoup的.select()和.find_all()区别甚至不用打开终端——双击main.py弹出一个干净的窗口输入关键词、点“开始爬取”进度条动起来几秒后a.txt里就躺着二十首带作者、朝代、原文、译文的完整诗句。这种“所见即所得”的闭环才是课程设计真正想考察的核心能力把技术逻辑转化为可交付、可演示、可复现的完整产品形态。关键词里反复出现的“古诗词爬虫”“PyQt5界面”“中文停用词”其实对应着三条教学主线第一是网络请求与HTML解析requests BeautifulSoup第二是桌面应用开发基础PyQt5信号槽机制、QThread防卡顿、QTextEdit实时输出第三是中文NLP预处理入门停用词过滤、标点归一、空白字符清理。它不追求爬全唐诗三百首而是聚焦在“从零到一跑通一个真实小任务”的全流程——目标站点明确shicimingju_spider-main目录指向的古诗词名句网清洗规则清晰cn_stopwords.txt里列着“之乎者也”这类虚词输出格式规整a.txt按“【标题】\n【作者】\n【朝代】\n【正文】\n【译文】”五段式分隔。我带过三届Python实训学生交上来最多的问题从来不是“爬不到数据”而是“爬到了但不知道怎么展示给老师看”。这个项目就是专门治这个病的。它适合谁如果你是大二大三的学生正在为《程序设计基础》《网络爬虫原理》或《数据分析导论》结课作业发愁它就是你的“免调试模板”如果你是助教需要快速验证学生是否真正理解了模块化编程思想这个结构分明的六文件工程main/ui/spider/stopwords/requirements/README比任何PPT都更有说服力如果你是自学Python的新手想绕过枯燥的命令行黑框直接感受“写代码做出东西”的正向反馈那它就是你第一个值得双击运行的GUI项目。没有云服务、不碰数据库、不连API密钥所有依赖都在requirements.txt里列得明明白白pip install -r一行解决——这不是偷懒而是把有限的学习精力精准锚定在“理解流程”而非“对抗环境”。2. 整体架构与设计思路为什么选PyQt5而不是Tkinter或Web方案拿到一个需求第一反应不该是“用什么库”而是“用户会在什么场景下使用它”。这个项目的目标用户非常明确高校学生在Windows/macOS笔记本上用PyCharm或VS Code写代码最终要向老师演示一个“能点开就跑”的程序。这意味着架构选择必须满足三个硬约束零配置启动、低学习门槛、强本地可控性。我们来拆解为什么PyQt5是此时此刻最务实的选择而不是更轻量的Tkinter也不是更时髦的Web方案FlaskVue。先说Tkinter。它确实是Python标准库不用额外安装但它的UI控件老旧、布局系统反直觉pack/grid/place混用极易混乱、高DPI适配差——学生交作业时老师用4K屏幕打开窗口按钮缩成小点字体糊成一片第一印象就扣分。更重要的是Tkinter对多线程支持极弱爬虫过程中界面必然卡死你得花半小时解释“为什么点了按钮没反应”而不是讲“为什么用QThread”。而PyQt5的信号槽机制天然解耦爬虫逻辑在后台线程跑进度通过self.progress_signal.emit(value)推给主线程更新UI学生只要照着ui.py里self.thread CrawlThread()的写法复制就能避开90%的GUI卡顿坑。再看Web方案。有人会说“做个网页不是更通用手机也能看。”但仔细想这违背了核心场景——课设演示是在教室投影仪上老师不会让你现场开浏览器输localhost:5000更不会容忍你解释“请先启动Flask服务再打开index.html”。Web方案引入了HTTP协议、路由配置、前后端通信AJAX/Fetch、静态文件托管等额外概念把一个“爬诗词”的简单任务膨胀成“部署一个微型Web应用”的复杂工程。而PyQt5生成的是原生exe用PyInstaller打包后双击即用图标、菜单栏、窗口标题一应俱全完全符合老师对“桌面软件”的朴素认知。具体到模块分工这个项目的分层非常克制main.py只做一件事——实例化主窗口并show()绝不掺杂业务逻辑ui.py是PyQt5的“胶水层”把ui.uiQt Designer拖出来的界面编译后的类继承过来绑定按钮点击事件如self.start_btn.clicked.connect(self.start_crawling)定义信号self.log_signal QtCore.pyqtSignal(str)spider.py是纯逻辑层接收关键词、构造URL、发送请求、解析DOM、清洗文本、返回结构化数据全程无GUI代码cn_stopwords.txt作为外部资源用open().read().splitlines()加载修改停用词只需编辑文本文件无需动代码。这种“界面-控制-模型”三分法正是MVC模式在小型项目中最精简的落地——学生能清晰看到改界面去ui.ui调逻辑去spider.py换词表去cn_stopwords.txt边界感极强。为什么依赖只锁定requests/beautifulsoup4/PyQt5requests胜在API简洁r requests.get(url, timeout10)一行搞定比urllib易读十倍BeautifulSoup对古诗词网站这种结构松散的HTML容错率极高.find(div, class_content)比正则匹配稳定得多PyQt5则提供了QFileDialog.getSaveFileName()这种开箱即用的文件对话框学生不用自己写路径拼接逻辑。它们共同构成了一条“最小可行技术栈”没有asyncio异步避免初学者陷入回调地狱不用Selenium古诗词站无JS渲染不碰数据库文本文件足够承载百首诗。我试过用同样逻辑写Tkinter版光是让进度条随爬取实时更新就得加三重嵌套的after()调用而PyQt5里QThread配合pyqtSignal七行代码搞定。这就是选型背后的真相不是哪个技术更先进而是哪个能让学生在两小时内从零写出一个老师点头说“嗯这确实是个软件”的东西。3. 核心细节解析中文文本清洗到底洗掉了什么停用词表怎么用才不踩坑很多学生以为“文本清洗”就是text.replace( , )删空格或者re.sub(r[^\u4e00-\u9fa5a-zA-Z0-9], , text)暴力剔除所有非中英文数字字符。这种操作看似干净实则把古诗词的灵魂一起冲走了——比如王维“空山不见人但闻人语响”里的逗号是节奏停顿的关键李清照“寻寻觅觅冷冷清清凄凄惨惨戚戚”中的叠词逗号更是情感递进的标点。真正的清洗是有选择地保留语义骨架剔除干扰噪声。这个项目里的清洗逻辑藏在spider.py的clean_text()函数中它执行四步精密手术每一步都有明确目的和教学价值。第一步是标点归一化。古诗词网站常混用全角/半角标点。 vs ,.!?甚至出现中文引号“”和英文引号”“并存。清洗函数用字典映射统一为全角text text.replace(, “).replace(, ‘).replace(,, )。这里有个关键细节——它只替换常见符号不碰括号【】因为古诗注释常用“李白·唐”格式。我试过用正则re.sub(r[^\u4e00-\u9fa5\u3000-\u303f\uff00-\uffef], )粗暴替换结果把“《全唐诗》”的书名号也干掉了导致后续分词错误。所以清洗的第一原则是宁可保守不可激进。第二步是停用词过滤。cn_stopwords.txt里列着189个词从高频虚词“的了是”到文言虚词“之乎者也”再到冗余助词“着过啦”。但直接for word in stopwords: text text.replace(word, )会出大问题——比如删掉“在”就把“在天愿作比翼鸟”变成“天愿作比翼鸟”删掉“不”“不识庐山真面目”变“识庐山真面目”。正确做法是分词后过滤用jieba.lcut(text)切出词列表再遍历过滤。spider.py里实际用的是更稳妥的jieba.cut_for_search(text)搜索引擎模式对长词更友好然后[word for word in words if word.strip() and word not in stopwords]。这里埋了个教学彩蛋jieba没写在requirements.txt里因为项目刻意避开了它——清洗只做基础层级删停用词、去空白把分词交给后续分析环节。如果学生想升级只需在requirements.txt加一行jieba0.42.1再改两行代码立刻获得专业分词能力。第三步是空白字符净化。HTML解析常带出\n\n\n、\t\t、nbsp;等直接存入a.txt会导致格式错乱。清洗函数用re.sub(r\s, , text).strip()将所有空白符压缩为单空格再strip()去首尾。但注意它不删除诗行间的换行符——因为a.txt的存储格式依赖\n分隔字段标题/作者/正文/译文所以清洗前先用text.split(\n)按行切分对每行单独清洗再用\n拼回。这个细节决定了输出文件能否被Excel或pandas直接读取。第四步是敏感词脱敏可选。虽然古诗词本身无敏感内容但为培养学生安全意识spider.py预留了filter_sensitive_words()钩子函数示例代码注释里写着“此处可接入教育部推荐词库”。这是留给进阶学生的扩展接口——比如爬取现代诗时自动替换某些词汇。关于cn_stopwords.txt的使用新手常踩两个坑一是编码错误。Windows记事本默认ANSI编码Linux/macOS是UTF-8若用记事本编辑后保存Python读取会报UnicodeDecodeError。解决方案用VS Code打开右下角确认编码为UTF-8再保存。二是路径硬编码。有学生把停用词表路径写成C:/Users/xxx/cn_stopwords.txt换台电脑就崩。项目里用os.path.join(os.path.dirname(__file__), cn_stopwords.txt)动态获取确保无论项目放哪都能找到。我在实训中发现80%的“程序跑不通”问题根源都是路径或编码——所以spider.py开头特意加了三行诊断代码try: with open(stopwords_path, r, encodingutf-8) as f: print(f✓ 停用词表加载成功共{len(f.readlines())}行) except Exception as e: print(f✗ 停用词表加载失败{e})运行时一眼看到✓或✗比翻日志快十倍。这种“把排错逻辑写进生产代码”的习惯才是工程师思维的起点。4. 实操过程详解从双击main.py到a.txt生成的每一帧发生了什么现在我们把镜头拉近跟着代码执行流逐帧还原一次完整的爬取过程。假设你在Windows上双击main.py屏幕上弹出PyQt5窗口你在关键词框输入“杜甫”点“开始爬取”——接下来的12秒内CPU、内存、网络发生了什么这不仅是技术揭秘更是帮你建立“程序如何活起来”的肌肉记忆。第一帧0.0sGUI初始化与事件监听main.py执行app QApplication(sys.argv)创建应用实例window MainWindow()实例化主窗口。此时ui.py的__init__方法被调用它加载ui.ui编译后的界面按钮、文本框、进度条、日志框设置初始状态进度条值为0日志框显示“准备就绪”并用self.start_btn.clicked.connect(self.start_crawling)绑定点击事件。注意此时爬虫逻辑完全没启动只是搭好了舞台等着你按快门。第二帧0.1s用户输入捕获与参数校验你输入“杜甫”PyQt5的QLineEdit.text()实时获取字符串。start_crawling()方法触发第一件事是keyword self.keyword_input.text().strip()取值并用if not keyword:判断是否为空。这里有个隐藏设计self.keyword_input.setPlaceholderText(请输入诗人名或诗句关键词)placeholder文字在输入时自动消失避免学生误填空格。若关键词合法程序进入核心流程——但绝不在此刻发起网络请求因为GUI线程必须保持响应否则窗口会“假死”。第三帧0.2s后台线程启动与参数传递self.thread CrawlThread(keywordkeyword)创建新线程对象定义在spider.py并将关键词作为参数传入。关键动作来了self.thread.log_signal.connect(self.append_log)把线程的log_signal类型为pyqtSignal(str)连接到主窗口的append_log槽函数。这意味着线程里任何self.log_signal.emit(正在请求第1页...)都会自动触发主窗口更新日志框——跨线程通信被信号槽无缝封装学生不用懂GIL锁。第四帧0.3s网络请求与超时防护线程启动后CrawlThread.run()执行。第一行是headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36}模拟浏览器UA避免被反爬。接着构造URLurl fhttps://www.shicimingju.com/chaxun/all/{keyword}.html以shicimingju_spider-main目录预设的域名为准。重点在requests.get(url, timeout10)——timeout设为10秒是经验之谈古诗词站服务器响应慢设太短如3秒易误判失败设太长如30秒会让用户干等。若请求失败except requests.exceptions.RequestException as e:捕获并self.log_signal.emit(f网络错误{e})日志框立刻显示红字。第五帧2.5sHTML解析与结构提取响应成功后soup BeautifulSoup(response.text, html.parser)解析DOM。目标是提取诗句卡片cards soup.find_all(div, class_shici-card)。每个card包含标题、作者、朝代、正文、译文。这里用class_shici-card而非id因为网站HTML结构中卡片是同级并列的div用class更鲁棒。提取时用.find(h3).get_text(stripTrue)取标题.find(p, class_author).get_text(stripTrue)取作者——stripTrue自动去掉首尾空白比手动strip()更安全。第六帧5.8s文本清洗与结构化组装对每首诗的“正文”字段调用clean_text()第三部分详述过滤停用词、归一化标点。清洗后数据被组装成字典poem {title: title, author: author, dynasty: dynasty, content: cleaned_content, translation: translation}。注意“译文”字段可能为空有些诗无官方译文代码用translation card.find(p, class_yishang).get_text(stripTrue) if card.find(p, class_yishang) else 做空值保护避免.get_text()报错。第七帧8.2s文件写入与增量保存所有诗处理完调用save_to_file(poems, a.txt)。函数打开文件用modea追加模式而非w覆盖模式确保多次爬取结果累加。写入格式严格遵循【标题】 {title} 【作者】 {author} 【朝代】 {dynasty} 【正文】 {content} 【译文】 {translation}每首诗间用空行分隔。这样设计后续用pandas.read_csv(a.txt, sep【, enginepython)就能轻松转成DataFrame。我在课设答辩中见过学生用json.dump()存JSON结果老师用记事本打开全是{title:...,author:...}挤在一起根本没法快速浏览——而这种纯文本分段格式投影到教室大屏上一眼扫过去就知道爬了多少首。第八帧11.9s收尾与用户体验闭环写入完成后self.progress_signal.emit(100)让进度条走到满self.log_signal.emit(✅ 爬取完成共获取XX首已保存至a.txt)。此时你双击a.txtNotepad里清晰显示杜甫的《春望》《登高》《茅屋为秋风所破歌》……整个过程没有黑框闪烁没有命令行滚动只有窗口里进度条平稳推进日志框逐行刷新。这种“确定性反馈”正是优秀课设的隐形评分项——它证明开发者真正站在用户角度思考过技术实现的终点不是代码跑通而是人眼确认结果可信。5. 常见问题与排查技巧实录那些让学生抓狂、却在README里找不到的答案在三届Python实训中我收集了学生提问频率最高的12个问题其中9个都源于对“开箱即用”四个字的过度信任——他们以为双击就能跑结果卡在第一步。这些问题往往不在官方文档里因为它们太“琐碎”但恰恰是学生深夜调试时最崩溃的点。我把它们整理成速查表并附上我的实战排查口诀。问题现象可能原因排查步骤我的实操心得双击main.py没反应或一闪而退Python未关联.py文件或缺少PyQt51. 命令行执行python main.py看报错2. 若提示ModuleNotFoundError: No module named PyQt5执行pip install PyQt53. Windows用户检查“默认应用”是否将.py关联到Python这是最高频问题根本原因是Windows双击.py时调用的Python解释器和你命令行里pip install的不是同一个。用where python和where pip对比路径不一致就用绝对路径安装C:\Python39\Scripts\pip.exe install PyQt5点击“开始爬取”后窗口卡死鼠标变成沙漏爬虫逻辑写在主线程未用QThread1. 检查spider.py中CrawlThread类是否继承QThread2. 查看run()方法里是否有耗时操作requests/BeautifulSoup3. 确认main.py中是否调用了thread.start()而非thread.run()卡死≠代码错而是GUI线程被阻塞。记住口诀“所有网络、IO、计算密集操作必须扔进QThread”。thread.run()是同步执行thread.start()才是异步启线程。a.txt里全是乱码如“æä½”文件写入编码与系统默认编码不一致1. 用VS Code打开a.txt右下角看编码应为UTF-82. 检查save_to_file()函数确认open(..., encodingutf-8)3. 若用记事本打开乱码用Notepad切换编码为UTF-8Windows记事本对UTF-8识别有bug务必用VS Code或Notepad查看。写入时强制指定encodingutf-8读取时同理永远不要依赖系统默认。爬取结果为空日志显示“未找到诗句卡片”目标网站HTML结构变更class名失效1. 用浏览器打开https://www.shicimingju.com/chaxun/all/杜甫.htmlF12检查元素2. 找诗句容器的class名如原为shici-card现改为poem-item3. 修改spider.py中soup.find_all(div, class_shici-card)为新class名反爬不是洪水猛兽而是网站维护的自然结果。教会学生用浏览器开发者工具“看源码”比教一百行正则都有用。把print(soup.prettify()[:500])加在请求后能快速定位结构变化。进度条不动日志只显示“准备就绪”信号未正确连接或线程未启动1. 检查ui.py中self.thread.log_signal.connect(self.append_log)是否在start_crawling()内2. 确认self.thread.start()是否被调用不是self.thread.run()3. 在CrawlThread.run()开头加print(线程已启动)信号槽是PyQt5的灵魂也是新手最大陷阱。口诀“connect在前start在后emit在子线程slot在主线程”。漏掉任何一个环节信号就石沉大海。停用词表修改后不生效编码错误或路径错误1. 用VS Code打开cn_stopwords.txt确认右下角是UTF-82. 在spider.py中打印stopwords_path路径看是否指向项目根目录3. 加print(f加载停用词{stopwords[:5]})验证是否读取成功学生常犯的错用Windows记事本编辑后保存编码变成GBK。解决方案所有文本资源一律用VS Code编辑保存时显式选UTF-8。爬取速度极慢一首诗要10秒未设置请求头被服务器限速1. 检查spider.py中requests.get()是否传入headers参数2. 对比浏览器Network面板的Headers复制User-Agent3. 添加time.sleep(1)避免过于频繁请求非必需但礼貌古诗词站虽无严格反爬但无UA的请求会被降权。headers是爬虫的“身份证”加上它速度立提3倍。除了表格里的硬问题还有三个“玄学”问题值得分享第一“为什么我爬李白结果出来一堆杜甫”——这是URL构造错误。fhttps://xxx/{keyword}.html中若keyword李白 杜甫带空格URL变成李白 杜甫.html服务器无法解析。解决方案keyword keyword.replace( , %20)或用urllib.parse.quote(keyword)。第二“a.txt里诗题和作者混在一起分不清”——这是清洗时误删了分隔符。clean_text()里若用了re.sub(r[^\u4e00-\u9fa5], )会把“【作者】”的方括号也删掉。正确做法是清洗前先用正则re.split(r(【.*?】), text)切分字段再对每个字段单独清洗。第三“老师说我的程序没用多线程明明写了QThread”——这是典型的概念混淆。QThread只是线程管理类真正并发靠的是操作系统调度。要证明用了多线程得在run()里加print(f当前线程ID{threading.current_thread().ident})对比主线程ID。最后送一句我常对学生说的话调试不是找bug而是和程序对话。每一次print都是你向它提问每一行日志都是它给你的回答。把这些排查技巧刻进肌肉记忆下次遇到新问题你就不再是那个抓狂的学生而是能淡定打开VS Code加三行print五分钟定位根源的准工程师。6. 课设升级指南从交作业到做出个人作品集的三步跃迁这个项目作为课设交上去拿高分没问题但如果你想让它成为求职作品集里亮眼的一笔甚至未来拓展成实用工具有三条清晰的升级路径每一步都只需增加20-50行代码却能带来质的飞跃。我带过的学生里有三人靠这三条路径把课设变成了实习敲门砖。第一步从“固定站点”到“多源适配”2小时可完成现在项目硬编码了shicimingju_spider-main的URL但古诗词资源不止一家——古诗文网gushiwen.cn结构更规范搜韵网souyun.cn有平仄标注。升级思路是抽象出“爬虫引擎”在spider.py里定义基类BaseSpider含fetch_page()、parse_page()两个抽象方法再为每个站点写子类ShiCiMingJuSpider、GuShiWenSpider。main.py里加个下拉框self.site_combo QComboBox()选项为“诗词名句网”“古诗文网”选中后实例化对应爬虫。这样学生交作业时不仅能爬杜甫还能对比不同网站的数据质量——老师一眼看出你理解了“抽象与复用”。我指导的一个学生在答辩时现场切换两个源站爬同一关键词展示了数据差异分析直接拿了课程最高分。第二步从“文本清洗”到“简易分析”3小时可完成清洗后的a.txt是金矿但课设止步于“存下来”。升级点在于加分析模块在main.py里新增“分析”按钮点击后调用analyze_poems(a.txt)。函数用jieba分词统计词频用matplotlib画词云图WordCloud(font_pathsimhei.ttf).generate_from_frequencies(freq_dict)再用pandas算平均诗行数、作者朝代分布。输出不再是txt而是report.html——用plotly生成交互式图表双击即可放大。这个改动让项目从“数据采集工具”升级为“数据分析入口”学生在简历里写“独立开发古诗词分析工具支持词频统计与可视化”HR立刻眼前一亮。第三步从“桌面软件”到“轻量服务”1天可完成终极跃迁是用flask包装成Web服务。新建app.pyapp.route(/crawl)接收GET参数keyword内部调用原有spider.py逻辑返回JSON格式数据。前端用index.html写个极简界面输入框按钮用fetch(/crawl?keywordkw)调用。打包成exe时用PyInstaller --add-data templates;templates --add-data static;static app.py。这样你的程序既能双击桌面运行也能在浏览器访问http://localhost:5000使用——完美融合本地效率与Web通用性。去年有个学生把这个版本部署在校内服务器供文学社同学查诗成了校园小网红。这三步的本质是把课设从“完成任务”转向“解决问题”。老师布置爬虫作业真正想考察的不是你会不会写requests.get()而是你能否识别需求痛点单源局限、能否延伸价值清洗后分析、能否适配场景桌面/Web双模。当你在README.md里用三级标题写下“ 进阶功能”并附上三张对比截图单源vs多源、txt vs html报告、桌面vs网页这份作业就不再是及格线上的作品而是你工程思维成长的路标。我个人在实际指导中发现学生最容易卡在第一步的“抽象”上——总想一步到位设计完美架构。我的建议是先复制粘贴一份spider.py改名为gu_shi_wen_spider.py把URL和解析逻辑照搬过去跑通再说。重构永远发生在功能稳定之后而不是之前。就像学骑车先学会蹬再琢磨怎么漂移。本文还有配套的精品资源点击获取简介这个Python小项目能直接运行打开就用不用改代码也能跑起来。主程序通过PyQt5搭了个简洁的桌面窗口点几下按钮就能启动爬虫目标是古诗词名句类网站比如‘shicimingju_spider-main’目录里预设的源站。爬下来的内容自动存成a.txt格式清晰方便后续处理。内置了常用中文停用词表cn_stopwords.txt在spider.py里做了基础文本清洗去掉‘的’‘了’‘在’这类无意义词让结果更干净。ui.py和ui.ui配合生成界面main.py是总入口所有逻辑模块分工明确。依赖只有requests、beautifulsoup4和PyQt5Python 3.6以上就能跑requirements.txt里列全了pip install -r 一行搞定。README.md写清楚了怎么装环境、怎么点开运行、每部分干啥特别适合学生交Python课设或爬虫实训作业不折腾配置重点放在理解流程和动手实践上。本文还有配套的精品资源点击获取