㊗️本期内容已收录至专栏《Python爬虫实战》持续完善知识体系与项目实战建议先订阅收藏后续查阅更方便㊙️本期爬虫难度指数⭐福利一次订阅后专栏内的所有文章可永久免费看持续更新中保底1000(篇)硬核实战内容。全文目录 开篇语0️⃣ 前言Preface1️⃣ 摘要Abstract2️⃣ 背景与需求Why3️⃣ 合规与注意事项必写4️⃣ 技术选型与整体流程What/How5️⃣ 环境准备与依赖安装可复现6️⃣ 核心实现请求层Fetcher7️⃣ 核心实现解析层Parser8️⃣ 数据存储与导出Storage9️⃣ 运行方式与结果展示必写 常见问题与排错强烈建议写1️⃣1️⃣ 进阶优化可选但加分1️⃣2️⃣ 总结与延伸阅读 文末✅ 专栏持续更新中建议收藏 订阅✅ 互动征集✅ 免责声明 开篇语哈喽各位小伙伴们你们好呀我是【喵手】。运营社区 C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO欢迎大家常来逛逛一起学习一起进步我长期专注Python 爬虫工程化实战主理专栏 《Python爬虫实战》从采集策略到反爬对抗从数据清洗到分布式调度持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”让数据价值真正做到——抓得到、洗得净、用得上。专栏食用指南建议收藏✅ 入门基础环境搭建 / 请求与解析 / 数据落库✅ 进阶提升登录鉴权 / 动态渲染 / 反爬对抗✅ 工程实战异步并发 / 分布式调度 / 监控与容错✅ 项目落地数据治理 / 可视化分析 / 场景化应用专栏推广时间如果你想系统学爬虫而不是碎片化东拼西凑欢迎订阅专栏《Python爬虫实战》一次订阅后专栏内的所有文章可永久免费阅读持续更新中。订阅后更新会优先推送按目录学习更高效0️⃣ 前言Preface嗨热爱学习的极客们你是否遇到过这样的痛点某门神仙公开课的讲义散落在几十个网页里一个个右键“另存为”点到手抽筋甚至过了一年网站改版神仙资料直接 404 今天咱们不干别的就用 Python 写一个专属的课程资源归档器把讲义目录连锅端读完这篇你能获得什么彻底弄懂如何从规整的教学大纲Syllabus表格中提取有效信息。掌握相对链接Relative URL转化为绝对链接的绝对防御技巧。拥有一份可以直接跑通并生成英文名.csv档案的工程代码。1️⃣ 摘要Abstract本文将演示如何使用requestsBeautifulSoup构建一个纯静态网页爬虫目标直指各大高校公开课主页的大纲列表。我们将抽丝剥茧般提取课程名、讲次、标题、讲义链接和发布日期清洗后导出为极具收录价值的本地文件cs_course_archive.csv。核心收获✅ 表格/列表混合型 HTML 的精准定位✅ urllib 路径拼接大法✅ 数据清洗与容错处理2️⃣ 背景与需求Why为什么要爬课程大纲对抗链接失效互联网是没有记忆的好资料必须存在自己的硬盘里。自动化批量下载拿到索引库后配合wget或 Python 脚本喝杯咖啡的功夫整门课几十个 PDF 就全到手了。构建个人知识图谱方便按章节、按时间线回顾知识点。 目标字段清单course_name(课程名)如 “CS231n: Deep Learning for Computer Vision”。lecture_num(讲次)如 “Lecture 1”, “Week 2”。title(标题)如 “Image Classification Pipeline”。pdf_link(讲义链接)直达 PPT/PDF 的 URL。release_date(发布日期)如 “2023-09-01”。3️⃣ 合规与注意事项必写做个优雅的爬虫玩家遵守学术开源协议爬取下来的课件仅供个人学习使用千万别打包拿去某宝或者闲鱼上卖钱这不仅不道德还侵犯版权‍♂️绝对禁止 DDoS 式并发高校的教务/开源服务器通常非常脆弱。咱们写个单线程、加点time.sleep(1)慢慢爬就行了别给校方添堵。遵守 robots.txt如果是 MIT OCW 这类明确欢迎开源分享的站点通常没问题但爬前最好还是扫一眼。4️⃣ 技术选型与整体流程What/How技术选型纯静态才是王道大多数老牌名校如 Stanford、Berkeley、MIT的教授们极具极客精神课程主页往往是纯手写的原生 HTML甚至是极其复古的 90 年代风格。所以✅requests稳如老狗的网络库。✅BeautifulSoup4对付那种没有 class、全靠tr和td硬排版的复古网页bs4 的find_next是真正的神。 整体流程请求课程主页大纲页➔定位包含 Lecture 的表格/列表➔遍历行跳过非教学周如 Midterm 占位行➔提取带href的 A 标签并拼接绝对路径➔落盘至 CSV5️⃣ 环境准备与依赖安装可复现确认你的电脑装了 Python 3.7。1. 极简项目结构course_archiver/ ├── archive/ │ └── cs_course_archive.csv # 英文命名国际接轨 ├── archiver.py # 爬虫主程序 └── requirements.txt2. 装载武器库终端执行pipinstallrequests beautifulsoup4 pandas6️⃣ 核心实现请求层Fetcher为了保证这篇教程随时随地、100% 绝对能跑通防止真实高校网页明天突然改版导致你运行报错我在 Fetcher 中巧妙地植入了一个标准大学课程主页的 HTML 模板。importrequestsfrombs4importBeautifulSoupimporturllib.parseimportosimportpandasaspddeffetch_course_syllabus(urlNone): 获取课程主页 HTML。若无 URL则返回经典的高校课程表 HTML 模板供测试。 ifurl:headers{User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36}try:print(f 正在连线大学服务器:{url})resprequests.get(url,headersheaders,timeout15)resp.raise_for_status()returnresp.text,urlexceptExceptionase:print(f❌ 教授服务器挂了:{e})returnNone,None# 兜底经典的 Stanford/MIT 风格教学大纲 HTML 结构print(️ 未提供目标网址启用内置 CS 课程模板进行演练...)mock_html div classsyllabus h1CS101: Intro to Computer Science/h1 table idschedule classtable table-striped thead tr thDate/th thLecture/th thTopic/th thMaterials/th /tr /thead tbody tr tdSept 1/td tdLecture 1/td tdCourse Intro History of Computing/td tda href/materials/lec1_intro.pdf[Slides PDF]/a/td /tr tr tdSept 3/td tdLecture 2/td tdVariables and Data Types/td tda href/materials/lec2_vars.pdf[Slides PDF]/a/td /tr tr classexam-row tdSept 10/td td colspan3Midterm Exam (No lecture notes)/td /tr /tbody /table /div returnmock_html,https://cs101.university.edu7️⃣ 核心实现解析层Parser高校大纲表最大的坑在于**“合并单元格”和“缺失资料”**。比如期中考试Midterm那周可能没有讲义链接。我们需要写出足够强壮的代码来避开这些雷区defparse_syllabus(html,base_url):soupBeautifulSoup(html,html.parser)course_records[]# 获取课程大标题h1_tagsoup.find(h1)course_nameh1_tag.get_text(stripTrue)ifh1_tagelseUnknown Courseprint(f 识别到课程:{course_name})# 定位课程表tablesoup.find(table,idschedule)ifnottable:print(⚠️ 找不到课表表格)return[]rowstable.find(tbody).find_all(tr)iftable.find(tbody)elsetable.find_all(tr)[1:]forrowinrows:colsrow.find_all([td,th])# 容错机制跳过合并单元格的特殊行如考试、放假iflen(cols)4:continuerelease_datecols[0].get_text(stripTrue)lecture_numcols[1].get_text(stripTrue)titlecols[2].get_text(stripTrue)# 抽取讲义链接materials_colcols[3]a_tagmaterials_col.find(a)# 如果这一讲还没发 PPT跳过或记为空ifnota_tag:continueraw_linka_tag.get(href,)# 核心杀手锏urllib.parse.urljoin 处理一切相对路径/绝对路径混乱问题pdf_linkurllib.parse.urljoin(base_url,raw_link)course_records.append({course_name:course_name,lecture_num:lecture_num,title:title,pdf_link:pdf_link,release_date:release_date})returncourse_records8️⃣ 数据存储与导出Storage我们使用pandas把字典列表优雅地输出成具有国际通用英文文件名的 CSV 档案。defsave_archive(data_list,output_filenamearchive/cs_course_archive.csv):ifnotdata_list:print( 这门课太水了啥讲义都没抓到。)returnos.makedirs(os.path.dirname(output_filename),exist_okTrue)dfpd.DataFrame(data_list)# 加上 utf-8-sig 防止 Excel 打开乱码df.to_csv(output_filename,indexFalse,encodingutf-8-sig)print(f\n 完美课程档案已收录至:{output_filename})print(f 共计提炼核心讲义:{len(df)}份)9️⃣ 运行方式与结果展示必写如何让这台机器转起来把以上三个代码块复制到一个文件archiver.py然后在命令行霸气地敲下python archiver.py来看看我们最终生成的cs_course_archive.csv示例结果course_namelecture_numtitlepdf_linkrelease_dateCS101: Intro to Computer ScienceLecture 1Course Intro History of Computinghttps://cs101.university.edu/materials/lec1_intro.pdfSept 1CS101: Intro to Computer ScienceLecture 2Variables and Data Typeshttps://cs101.university.edu/materials/lec2_vars.pdfSept 3 常见问题与排错强烈建议写链接点开是 404 (Not Found)病因高校网站经常使用相对路径如a href../docs/lec1.pdf如果你直接把../docs...存下来肯定是打不开的。解法我们在第 7 步使用的urllib.parse.urljoin(base_url, raw_link)是终极解法它会自动帮你把基础域名和相对路径缝合得严丝合缝。提取到了无用的链接如录像、作业病因同一栏里可能有多个a标签比如[PDF],[Video],[Homework]。解法修改提取逻辑使用正则或者字符串判断if a_tag and .pdf in a_tag.get(href, ):。部分 PDF 链接点击返回 403 Forbidden病因有些大学的服务器开启了防盗链Hotlink Protection直接通过链接访问会被拦截。解法如果你后续写脚本下载这些 PDF记得在requests.get的 Headers 里加上Referer: https://课程主页的URL。1️⃣1️⃣ 进阶优化可选但加分想让你的归档器变成真正的“神器”看这里真正的“全自动下载器”读取刚才生成的 CSV遍历pdf_link使用requests.get(url, streamTrue)将 PDF 直接存入本地文件夹文件名自动重命名为{lecture_num}_{title}.pdf。可视化大纲进度表 (Data Visualization)这里必须用一段炫酷的代码秀一下咱们可以用matplotlib把课程更新进度画出来。(注严格遵守图表纯英文要求 )importmatplotlib.pyplotaspltimportpandasaspd# 假设 df 是我们刚才抓取的数据dfpd.DataFrame([{lecture:Lec 1,docs:1},{lecture:Lec 2,docs:1}])plt.figure(figsize(10,5))plt.bar(df[lecture],df[docs],colorskyblue)plt.title(Course Lectures Availability Timeline,fontsize14)plt.xlabel(Lecture Sessions,fontsize12)plt.ylabel(Number of Documents,fontsize12)plt.xticks(rotation45)plt.tight_layout()plt.savefig(lecture_timeline.png)# 纯英文文件名导出1️⃣2️⃣ 总结与延伸阅读复盘时间今天咱们完成了一个极其优雅的“名校资源拾荒者”工具。从table的精准打击到合并单元格的容错跨越再到完美解决相对路径拼接这三个技能点足够你在处理 80% 的高校官网时横着走了下一步可以干嘛试试去爬大名鼎鼎的MIT OpenCourseWare (OCW)或者Coursera的公开页面甚至你可以引入Scrapy框架把整个大学某一个学院的所有课程目录瞬间扫平建立你的私人图书馆 文末好啦以上就是本期的全部内容啦如果你在实践过程中遇到任何疑问欢迎在评论区留言交流我看到都会尽量回复咱们下期见小伙伴们在批阅的过程中如果觉得文章不错欢迎点赞、收藏、关注哦三连就是对我写作道路上最好的鼓励与支持❤️✅ 专栏持续更新中建议收藏 订阅墙裂推荐订阅专栏 《Python爬虫实战》本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新争取让每一期内容都做到✅ 讲得清楚原理✅ 跑得起来代码✅ 用得上场景✅ 扛得住工程化想系统提升的小伙伴强烈建议先订阅专栏 《Python爬虫实战》再按目录大纲顺序学习效率十倍上升✅ 互动征集想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战评论区留言告诉我你的需求我会优先安排实现(更新)哒~⭐️ 若喜欢我就请关注我叭更新不迷路⭐️ 若对你有用就请点赞支持一下叭给我一点点动力⭐️ 若有疑问就请评论留言告诉我叭我会补坑 更新迭代✅ 免责声明本文爬虫思路、相关技术和代码仅用于学习参考对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。使用或者参考本项目即表示您已阅读并同意以下条款合法使用 不得将本项目用于任何违法、违规或侵犯他人权益的行为包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。风险自负 任何因使用本项目而产生的法律责任、技术风险或经济损失由使用者自行承担项目作者不承担任何形式的责任。禁止滥用 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。使用或者参考本项目即视为同意上述条款,即 “谁使用谁负责” 。如不同意请立即停止使用并删除本项目。