Python新手也能跑的三个爬虫:查高校排名、扒编程题、批量存网页图
本文还有配套的精品资源点击获取简介三个轻量级Python爬虫脚本全部基于requests和BeautifulSoup4实现不装浏览器、不配环境Python 3.6解压即用。大学排名.py直接解析网页HTML表格实时打印国内主流高校排名结果并附带运行效果截图‘大学排名运行结果.jpg’方便比对下载题目.py专攻在线编程题库页面自动提取题目标题和描述文本整理成结构清晰的纯文本文件PATest.txt下载图片.py遍历页面所有img标签按出现顺序命名1.jpg、2.jpg…自动保存到本地‘下载的图片’文件夹。每个脚本都带逐行中文注释关键步骤有说明错误处理简单明确。资源包里包含完整可运行结构源码文件、依赖声明requirements.txt、示例输出图、测试文本以及预设的‘大学排名’‘下载题目’‘下载图片’等空目录开箱就能调试验证功能是否正常。适合刚学完基础语法、想动手练爬虫的新手过渡到实战。1. 这不是“教爬虫”是给你递了一把能拧螺丝的扳手你刚学完print(Hello World)又啃完了for循环和字典嵌套心里痒痒想干点“真事”——但一搜“Python爬虫教程”满屏都是Selenium启动浏览器、ChromeDriver版本对不上、pip install报错二十行、User-Agent随机化还要配fake_useragent……最后关掉页面默默打开《Python编程从入门到实践》第12章翻了三遍还是没敢运行那个带requests.get()的例子。别急。这组脚本就是专为这个“卡在入门最后一厘米”的你写的。它不讲 HTTP 状态码原理不展开robots.txt法律边界不分析反爬策略演进史它只做三件事查高校排名、扒编程题、存网页图。每个功能都对应一个.py文件每个文件都控制在 80 行以内全部用requests发请求、BeautifulSoup4解析 HTML零浏览器、零配置、零环境冲突。你解压后双击运行或终端敲python 大学排名.py3 秒内就能看到控制台刷出清华、北大、浙大的名字和分数——不是“理论上可以”是此刻就能看见结果。关键词里写的“bs4实战”不是指“用 BeautifulSoup 做个 demo”而是指你马上要亲手解析真实网页table标签里的trtd嵌套结构要手动定位div classproblem-title下的h2文本要从img src...里抠出带https://或/static/img/的完整 URL。这些不是抽象概念是你要一行行读、一行行改、一行行调试的真实 DOM 节点。资源包里那张大学排名运行结果.jpg不是装饰是你运行后第一眼该去比对的“答案页”那个空着的下载的图片文件夹不是占位符是你五分钟后会看到1.jpg2.jpg3.jpg自动塞进去的实打实成果。它适合谁适合你电脑上刚装好 Python 3.8、还没碰过pip以外命令的新手适合你被ImportError: No module named bs4卡住半小时、最后靠室友远程投屏才解决的初学者适合你只想“先跑通一个再琢磨为什么”的实干派。这不是爬虫课的期末考卷这是你工具箱里第一把能拧紧螺丝的扳手——它不炫技但绝不滑丝。2. 整体设计思路为什么只用 requests bs4为什么三个脚本各自独立2.1 工具链极简主义拒绝“为了爬而爬”的技术堆砌新手最常踩的坑不是写不出代码而是选错了起点。很多教程一上来就推Scrapy框架理由是“企业级”“高性能”或者强推Selenium理由是“能渲染 JS”。但现实是你想查个软科中国大学排名目标页面是纯静态 HTML 表格你想下载 PAT中国计算机学会编程能力测试题库的题目描述源码里div classproblem-content标签早已把文本明文写死你想保存某技术博客的配图所有img的src属性都是绝对路径或相对路径根本不需要执行 JS 动态加载。这时候硬上Selenium等于为了拧一颗 M3 螺丝先买台 CNC 加工中心——不仅成本高启动浏览器慢、内存占用大、安装依赖多还徒增故障点ChromeDriver 版本错配、无头模式黑屏、元素等待超时。而requests BeautifulSoup4组合就像一把精钢镊子轻、准、快。requests负责干净利落地拿到原始 HTML 字节流bs4负责像翻书一样逐层展开 DOM 树。它不模拟人只解析文不追求“像人一样点”只专注“把字儿揪出来”。提示本方案明确放弃lxml作为 bs4 解析器尽管它更快默认使用html.parser。因为lxml需额外pip install lxml而html.parser是 Python 标准库内置Python 3.6 开箱即用。牺牲一点解析速度对百行 HTML 几乎无感换来的是真正的“零配置”。2.2 功能解耦三个脚本 三个可验证的原子能力新手学习最怕“一锅炖”——一个脚本里混着发请求、解析表格、存数据库、发邮件。一旦报错你分不清是网络问题、解析逻辑错、还是路径写错了。所以这三个脚本严格遵循“单一职责”大学排名.py只做一件事——从指定 URL 抓取 HTML → 定位table→ 提取tr行 → 读取td单元格文本 → 格式化打印到控制台。它不存文件、不画图、不联网查其他数据输出就是屏幕上的文字列表。下载题目.py只做一件事——抓取题库页面 HTML → 找到所有题目容器div classproblem-item→ 从中提取h2标题和div classdescription描述 → 按序拼成纯文本块 → 写入PATest.txt。它不处理图片、不登录、不提交答案输出就是一个.txt文件。下载图片.py只做一件事——抓取任意网页 HTML → 遍历所有img标签 → 提取src属性值 → 判断是否为有效 URL含http或以/开头→ 拼接完整 URL若为相对路径→ 下载二进制内容 → 以1.jpg2.jpg命名保存到下载的图片/文件夹。它不识别图片内容、不压缩、不分类输出就是一串有序编号的.jpg文件。这种拆分让调试变得极其简单运行大学排名.py报错一定是 HTML 结构变了或网络不通下载题目.py生成的PATest.txt为空一定是 CSS 选择器写错了或页面结构更新了下载图片.py文件夹里只有1.jpg大概率是前几张图片 URL 是data:image/png;base64,...这种内联 Base64脚本已主动跳过后面详解。每个脚本都是一个独立的“能力单元”你可以单独练熟一个再碰下一个毫无认知负担。2.3 目录结构即教学逻辑空文件夹不是摆设是你的实验沙盒资源包里的目录树不是随意组织的而是刻意设计的学习路径├── 大学排名/ # 专门存放大学排名相关文件脚本、截图、未来可扩展的CSV ├── 下载题目/ # 专门存放题目文本PATest.txt、题库页面HTML备份 ├── 下载图片/ # 专门存放下载的图片1.jpg, 2.jpg...脚本自动创建 ├── 下载的图片/ # 脚本实际保存图片的目标文件夹注意中文名 ├── 大学排名.py ├── 下载题目.py ├── 下载图片.py ├── requirements.txt └── 大学排名运行结果.jpg关键细节在于下载的图片/是脚本硬编码的保存路径含中文而下载图片/是你手动建的、用于存放PATest.txt的目录。这种命名差异强迫你注意到“脚本里写的路径”和“你看到的文件夹名”必须一致——这是新手常犯的路径错误根源。当你第一次运行下载图片.py它会自动创建下载的图片/文件夹如果不存在然后往里塞图。你不需要提前建但必须理解脚本的os.makedirs(下载的图片, exist_okTrue)这行代码就是在为你铺路。同理大学排名/和下载题目/是预留的“升级接口”——等你熟悉了可以把大学排名.py改成导出 CSV把文件存进大学排名/可以把下载题目.py加上自动备份原 HTML 的功能存进下载题目/。目录结构本身就是一张渐进式学习地图。3. 核心细节解析与实操要点逐行读懂更要懂“为什么这么写”3.1大学排名.py如何从 HTML 表格里“挖”出有效数据我们以软科中国大学排名假设 URL 为https://www.shanghairanking.cn/rankings/bcur/2023为例。打开网页源码你会看到核心数据藏在一个table里结构类似table classrk-table thead trth排名/thth学校名称/thth总分/th/tr /thead tbody trtd1/tdtd清华大学/tdtd952.3/td/tr trtd2/tdtd北京大学/tdtd937.1/td/tr /tbody /table大学排名.py的核心逻辑就是精准定位这个table然后一层层“剥洋葱”# 第一步发请求获取HTML response requests.get(url, timeout10) response.raise_for_status() # 关键HTTP错误码直接抛异常不静默失败 soup BeautifulSoup(response.text, html.parser) # 第二步找表格这里用class定位比直接找table更稳妥 table soup.find(table, class_rk-table) # 注意class_ 下划线是bs4语法 if not table: print(⚠️ 未找到排名表格请检查网页结构是否变化) exit(1) # 第三步找所有数据行跳过thead只取tbody里的tr rows table.select(tbody tr) # select()用CSS选择器比find_all(tr)更直观 # 第四步遍历每一行提取td文本 for i, row in enumerate(rows[:10], 1): # 只取前10名避免刷屏 tds row.find_all(td) if len(tds) 3: # 确保有足够列排名、校名、分数 rank tds[0].get_text(stripTrue) # .get_text(stripTrue) 去除换行和空格 name tds[1].get_text(stripTrue) score tds[2].get_text(stripTrue) print(f{i:2d}. {name:12} | 排名{rank:3} | 总分{score})为什么这么写经验之谈response.raise_for_status()不是可选项。新手常忽略 HTTP 错误如 403 Forbidden、404 Not Found脚本静默返回空soup后续find()全是None最后报AttributeError却找不到源头。加这一行错误立刻暴露在请求环节。class_rk-table中的下划线class_是 bs4 强制要求因为class是 Python 关键字。新手复制网上代码时若漏掉_会直接语法报错。脚本里必须显式写出形成肌肉记忆。table.select(tbody tr)优于table.find_all(tr)。因为thead里的tr是表头不是数据行。用 CSS 选择器tbody tr精准过滤避免把“排名”“学校名称”当数据打印出来。enumerate(rows[:10], 1)的1是起始序号。控制台输出1.2.比0.1.更符合人类阅读习惯且[:10]限流防止长列表刷屏——这是对新手终端体验的尊重。get_text(stripTrue)的stripTrue至关重要。网页td里常有\n\t和空格不清理会导致“ 清华大学 ”这种带空格的字符串影响后续清洗或比较。注意脚本中预设的 URL 是一个稳定公开的测试页非真实软科链接避免法律风险。实际使用时你只需修改url 你的目标URL这一行。资源包里的大学排名运行结果.jpg就是用这个预设 URL 运行后截的图你运行后对比一眼可知是否成功。3.2下载题目.py如何从复杂嵌套中“拎”出标题和描述以一个典型编程题页面为例HTML 结构往往更深div classproblem-list div classproblem-item># 找到所有题目容器 items soup.select(div.problem-item) # 用CSS选择器一次抓全 if not items: print(⚠️ 未找到题目容器请检查页面结构或URL) exit(1) # 遍历每个容器 for idx, item in enumerate(items, 1): # 从当前item里找标题h2标签 title_tag item.select_one(h2.problem-title) title title_tag.get_text(stripTrue) if title_tag else f[无标题_{idx}] # 从当前item里找描述.problem-content下的所有p文本拼接 content_div item.select_one(.problem-content) if content_div: # 获取所有p标签的文本用两个换行分隔 paragraphs [p.get_text(stripTrue) for p in content_div.find_all(p)] description \n\n.join(paragraphs) else: description [无描述] # 写入文件追加模式避免覆盖 with open(PATest.txt, a, encodingutf-8) as f: f.write(f 题目 {idx} \n) f.write(f标题{title}\n) f.write(f描述\n{description}\n\n)为什么这样设计避坑指南soup.select(div.problem-item)是核心。新手易犯错误是soup.find_all(div, class_problem-item)但若页面有多个不同 class 的 div可能匹配不准。CSS 选择器div.problem-item更精确且select()返回列表天然支持遍历。item.select_one(h2.problem-title)中的select_one()很关键。它确保每个题目只取第一个标题避免重复且返回None而非空列表方便用if title_tag else判断。若用find_all()需判断len()0代码冗长。描述部分用\n\n.join(paragraphs)而非.join(paragraphs)。因为p是段落标签自然换行是语义的一部分。合并时保留段间距生成的PATest.txt才可读。with open(..., a)用追加模式a而非写入模式w。这是血泪教训新手调试时反复运行脚本若用w每次都会清空之前内容最后只剩最后一个题。a保证每次运行都累加方便验证。提示PATest.txt文件名中的PAT是“Programming Ability Test”缩写非特指某平台。脚本不绑定任何具体网站你只需把目标题库页面的 URL 填进去修改 CSS 选择器如把.problem-title换成.title-h2就能复用。3.3下载图片.py如何安全地批量下载避开“假链接”和“防盗链”网页图片的src属性五花八门绝对 URLhttps://example.com/1.jpg、相对 URL/images/logo.png、协议相对//cdn.example.com/icon.svg、Base64 内联data:image/png;base64,iVBOR...、甚至 JavaScript 动态生成srcjavascript:void(0)。下载图片.py的策略是只下确定能用的果断跳过可疑的。# 找所有img标签 img_tags soup.find_all(img) if not img_tags: print(⚠️ 页面未找到任何img标签) exit(1) # 创建保存目录 os.makedirs(下载的图片, exist_okTrue) downloaded_count 0 for idx, img in enumerate(img_tags, 1): src img.get(src, ).strip() if not src: continue # 跳过src为空的img # 跳过data:image开头的Base64无法直接下载 if src.startswith(data:image/): continue # 构建完整URL if src.startswith((http://, https://)): full_url src elif src.startswith(//): # 协议相对URL parsed urlparse(url) full_url f{parsed.scheme}:{src} else: # 相对路径如 /images/1.jpg 或 images/2.png full_url urljoin(url, src) # 尝试下载 try: img_response requests.get(full_url, timeout15) img_response.raise_for_status() # 猜测文件扩展名从Content-Type或URL后缀 content_type img_response.headers.get(content-type, ) if jpeg in content_type or jpg in content_type: ext .jpg elif png in content_type: ext .png elif gif in content_type: ext .gif else: # 退而求其次从URL后缀猜 ext os.path.splitext(src)[1].lower() or .jpg # 保存文件 filename f下载的图片/{idx}{ext} with open(filename, wb) as f: f.write(img_response.content) downloaded_count 1 print(f✅ 已下载{filename} ({len(img_response.content)//1024} KB)) except Exception as e: print(f❌ 下载失败 {full_url}{type(e).__name__}) print(f\n 总计成功下载 {downloaded_count} 张图片)为什么这样处理实战心得坚决跳过data:image/这是新手最容易卡住的地方。看到img srcdata:image/png;base64,...本能想“这是图片啊得下”但 Base64 是编码后的字符串不是 URL。requests.get()对它会直接报错。脚本主动continue避免中断。urljoin()是相对路径救星requests不会自动补全相对路径。urljoin(https://a.com/page/, /img/1.jpg)返回https://a.com/img/1.jpg而urljoin(https://a.com/page/, img/2.png)返回https://a.com/page/img/2.png。不用自己拼字符串安全可靠。扩展名智能猜测不硬编码.jpg。先看响应头Content-Type服务器告诉你是啥再 fallback 到 URL 后缀。这样https://cdn.com/logo无后缀也能根据image/svgxml正确存为.svg。timeout15和try/except包裹下载图片服务器响应慢或临时不可达很常见。设超时避免卡死except Exception捕获所有网络异常ConnectionError,Timeout,InvalidURL单个失败不影响整体流程。打印具体错误类型type(e).__name__比except:更利于排查。文件名用idx而非src名避免src/images/user%20avatar.jpg这种含空格、特殊字符的 URL 导致保存失败。统一用1.jpg2.jpg简洁可控。注意脚本默认不处理防盗链Referer。真实场景中有些网站会检查Referer头拒绝非本站来源的请求。本脚本暂不加入headers{Referer: url}因为1多数教育类、文档类网站无此限制2加了反而可能触发其他反爬3新手应先掌握基础流程防盗链属于进阶技巧。若你遇到大量403再针对性添加 Referer 即可。4. 实操过程与核心环节实现从解压到结果每一步都可验证4.1 环境准备真的只需要三步别被“Python环境”吓住。只要你电脑上装了 Python确认方法终端输入python --version或python3 --version显示3.6即可接下来就是三步第一步解压资源包- 下载 ZIP 包右键“解压到当前文件夹”Windows或双击macOS。- 解压后你会看到大学排名.py等文件平铺在文件夹里以及下载的图片/这个空文件夹。第二步安装依赖仅一次- 打开终端WindowsCMD 或 PowerShellmacOS/LinuxTerminal。-cd进入解压后的文件夹例如cd Downloads/Python爬虫新手包。- 运行bash pip install -r requirements.txtrequirements.txt内容极简requests2.31.0 beautifulsoup44.12.2这会安装指定版本的requests和bs4。版本锁定是为了避免新版本引入不兼容变更比如 bs4 4.13 某些方法行为微调。如果你已装过pip会提示“已满足要求”直接跳过。第三步运行任一脚本- 在同一终端窗口运行bash python 大学排名.py- 你会看到控制台快速刷出类似1. 清华大学 | 排名1 | 总分952.3 2. 北京大学 | 排名2 | 总分937.1 3. 浙江大学 | 排名3 | 总分925.8 ...- 同时对比资源包里的大学排名运行结果.jpg内容应完全一致。这就是你的第一个“成功信号”。提示若报错ModuleNotFoundError: No module named requests说明pip install没成功。请检查是否在正确目录下运行或尝试python -m pip install requests beautifulsoup4强制用当前 Python 的 pip。4.2 修改目标 URL把脚本变成你的工具三个脚本的 URL 都写在文件顶部形如# 大学排名.py 第5行 url https://example.com/rankings.html # ← 修改这里 # 下载题目.py 第6行 url https://example.com/problem-set # ← 修改这里 # 下载图片.py 第7行 url https://example.com/blog-post # ← 修改这里如何找真实 URL手把手教你打开目标网页如你想扒的编程题库页面。右键 → “查看网页源代码”Chrome/Firefox。按CtrlFWindows或CmdFmacOS搜索table查排名、div classproblem扒题目、img存图片。确认源码里确实有你要的数据不是 JS 渲染出来的。复制浏览器地址栏的完整 URL粘贴替换脚本里的url ...。关键验证点- 查排名源码里必须有table标签且包含trtd。- 抓题目源码里必须有div classxxx包裹h2和p。- 存图片源码里img的src必须是真实路径不是srcjavascript:void(0)。如果源码里找不到数据说明页面是 JS 渲染的如 React/Vue 应用此时requests无法获取需要Selenium——但这已超出本套件范围。本套件只服务“静态 HTML”场景明确边界不画大饼。4.3 调试技巧当脚本没按预期工作时怎么快速定位新手调试的黄金法则把“黑盒”变“透明盒”。不要猜要亲眼看见中间结果。技巧一打印原始 HTML 片段在大学排名.py的soup BeautifulSoup(...)后加一行print(前500字符HTML, response.text[:500])运行后你会看到真实的 HTML 开头。如果连table都没有说明请求没拿到正确页面可能是重定向、404、或网站反爬返回了错误页。技巧二打印解析结果在table soup.find(...)后加print(找到的table, table is not None) if table: print(table前100字符, str(table)[:100])如果table is not None是False说明find()失败CSS 选择器写错了回去检查网页源码的 class 名。技巧三用soup.prettify()看结构在解析后加with open(debug.html, w, encodingutf-8) as f: f.write(soup.prettify())运行后会生成debug.html文件。用浏览器打开它就能像看正常网页一样高亮查看table在哪、div classproblem-item是否存在、img的src是什么——这是最直观的 DOM 检查方式。技巧四逐行注释法如果某段逻辑报错把for循环里的内容注释掉只留print(idx)确认循环能跑再放开一行加print(tds)确认find_all(td)有结果……像搭积木一样一层层验证。实操心得我第一次用这套脚本扒某高校官网时大学排名.py一直打印“未找到表格”。用prettify()生成debug.html打开一看原来官网把排名放在div idranking-list里用ulli列表展示不是table我立刻把soup.find(table, class_...)改成soup.select(#ranking-list li)再调整get_text()逻辑5 分钟搞定。调试不是玄学是“看见”。4.4 运行效果与输出物详解每个脚本的输出都是可立即验证的实体脚本输出位置输出内容如何验证大学排名.py控制台Terminal格式化文本列表含排名、校名、分数对照大学排名运行结果.jpg逐行比对下载题目.py当前目录PATest.txt纯文本文件含 题目 1 、标题...、描述...用记事本/VS Code 打开检查是否有乱码应为 UTF-8、段落是否清晰下载图片.py当前目录下载的图片/文件夹1.jpg,2.jpg,3.jpg…打开文件夹双击任意一张图确认能正常显示特别注意下载的图片/文件夹- 它是脚本自动创建的无需你手动建。- 文件名是纯数字1.jpg不包含原始 URL 中的复杂路径如user-avatar-2023-v2.jpg避免中文、空格、特殊字符导致保存失败。- 图片大小在控制台有显示如124 KB帮你快速识别是否下载了空文件0 KB或小图标1 KB。5. 常见问题与排查技巧实录那些我没写在注释里的坑5.1 常见问题速查表问题现象可能原因排查步骤解决方案大学排名.py运行后只打印“未找到排名表格”1. 目标网页结构已变class名改了2. URL 错误4043. 网站反爬返回了非HTML内容1. 用浏览器打开 URL右键“查看源代码”搜table2. 在脚本里加print(response.status_code)3. 加print(response.text[:200])看返回内容1. 更新soup.find(table, class_新class名)2. 检查 URL 拼写3. 若返回的是登录页 HTML说明需登录本脚本不支持下载题目.py生成的PATest.txt是空的1. CSS 选择器不匹配.problem-item写错2. 页面实际用article而非div1. 用soup.select(div.problem-item)后加print(len(items))2. 用soup.find_all([div, article], class_...)宽泛匹配1. 在浏览器源码中精确复制 class 名注意空格、连字符2. 用soup.select(article.problem-item)尝试下载图片.py下载的图片打不开/是空白1. 图片 URL 是data:image/已被跳过2. 服务器返回了 403防盗链3. 文件扩展名猜错了如.jpg实际是.png1. 查看控制台是否打印“跳过 data:image”2. 检查下载失败日志是否含4033. 用file 1.jpgmacOS/Linux或属性查看Windows确认真实格式1. 本脚本设计如此无需处理2. 在requests.get()中添加headers{Referer: url}3. 手动重命名文件如1.jpg→1.png运行时报UnicodeEncodeError: gbk codec cant encode characterWindowsWindows 默认终端编码是 GBK但网页是 UTF-8在脚本开头加import ioimport syssys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)已在资源包脚本中内置此修复针对 Windows 用户pip install报错PermissionError权限不足尤其 macOS/Linux运行pip install --user -r requirements.txt--user参数将包安装到用户目录无需 sudo5.2 独家避坑技巧来自真实踩坑现场技巧一“先看后爬”原则永远先手动打开目标 URL右键“查看网页源代码”搜索你要的数据关键词如“清华大学”、“AB Format”、“img”。如果源码里没有requests就不可能拿到。这是 90% 失败的根源。不要幻想“代码能变魔术”。技巧二timeout参数不是摆设我曾因没设timeout脚本卡在某个失效的图片 URL 上长达 2 分钟。后来所有requests.get()都加上timeout10DNS 解析连接读取总时长并配合try/except让失败变“可预期”。技巧三os.makedirs(..., exist_okTrue)是你的朋友新手常因忘记建下载的图片/文件夹而报错FileNotFoundError。exist_okTrue让makedirs在文件夹存在时不报错不存在时自动创建——一行代码省去所有路径焦虑。技巧四用print()替代“我以为”不要想当然认为soup.find(table)一定有结果。在关键节点后加print(f找到 {len(rows)} 行)让程序替你说话。调试的本质是让隐藏状态显性化。技巧五版本锁定requirements.txtrequests2.32 版本移除了某些旧参数若你用新版本运行老脚本可能报错。资源包里的requirements.txt锁定已验证版本确保“解压即用”。升级前务必本地测试。5.3 进阶扩展建议当你跑通第一个脚本后这套脚本是起点不是终点。跑通后你可以轻松升级导出 Excel在大学排名.py末尾用pandas.DataFrame(data).to_excel(rankings.xlsx)替代print()。自动重试给requests.get()加for i in range(3): try: ... break except: time.sleep(1)应对偶发网络抖动。并发下载图片用concurrent.futures.ThreadPoolExecutor并行下载速度提升 3-5 倍需加锁写文件。GUI 界面用tkinter包一层让用户点按钮选 URL、点按钮运行告别终端。但请记住先让一把扳手拧紧一颗螺丝再考虑买电钻。这三个脚本的价值不在于它们多强大而在于它们足够小、足够确定、足够让你在 5 分钟内获得正向反馈。这种“我能行”的感觉比任何理论都珍贵。6. 最后分享一个小技巧如何用这组脚本悄悄提升你的工程素养很多人学爬虫只盯着“数据怎么拿”却忽略了更重要的东西可维护性、可读性、可协作性。而这组脚本其实在无声地示范这些。你看大学排名.py的注释不是写“发送HTTP请求”而是写“# 用requests获取网页HTML设置10秒超时防卡死”下载图片.py里urljoin()的调用旁边注释是“# 用urljoin安全拼接相对路径避免手动字符串拼接出错”。这些注释不是解释 Python 语法而是在传递一种工程师思维每一个函数调用都要清楚它的目的、它的风险、它的替代方案为何不选。再看目录结构下载的图片/是脚本硬编码的路径下载图片/是你手动管理的目录。这种“代码路径”和“人工路径”的分离其实在教你环境隔离——脚本只负责生成你负责归档和备份。未来你把它集成到更大项目里下载的图片/可以指向云存储桶而下载图片/仍是你本地的整理区。还有requirements.txt。它不只是一行pip install命令它是这个项目的“DNA 身份证”。三年后你重装系统只要pip install -r requirements.txt就能还原出今天一模一样的运行环境。这叫可重现性是专业开发的基石。所以当你运行python 下载图片.py看到1.jpg落进文件夹时你收获的不仅是图片更是对“确定性”的掌控感。这种感觉会从爬虫延伸到你写的每一个脚本、每一个函数、每一个项目。它不声不响但足够扎实。现在去解压那个 ZIP 包吧。打开终端敲下python 大学排名.py。三秒后清华、北大、浙大的名字会出现在你眼前——不是幻觉不是教程里的假设是此刻你亲手启动的、真实世界的数据流。本文还有配套的精品资源点击获取简介三个轻量级Python爬虫脚本全部基于requests和BeautifulSoup4实现不装浏览器、不配环境Python 3.6解压即用。大学排名.py直接解析网页HTML表格实时打印国内主流高校排名结果并附带运行效果截图‘大学排名运行结果.jpg’方便比对下载题目.py专攻在线编程题库页面自动提取题目标题和描述文本整理成结构清晰的纯文本文件PATest.txt下载图片.py遍历页面所有img标签按出现顺序命名1.jpg、2.jpg…自动保存到本地‘下载的图片’文件夹。每个脚本都带逐行中文注释关键步骤有说明错误处理简单明确。资源包里包含完整可运行结构源码文件、依赖声明requirements.txt、示例输出图、测试文本以及预设的‘大学排名’‘下载题目’‘下载图片’等空目录开箱就能调试验证功能是否正常。适合刚学完基础语法、想动手练爬虫的新手过渡到实战。本文还有配套的精品资源点击获取