Python爬虫教程知识点总结
前言学爬虫最怕的是「知识点是散的」今天记住urlopen的用法明天背会一个解析器的写法结果遇到一个新站点还是不知道从哪儿下手。这篇总结的目的就是把散落的知识点挂到一张地图上让你随时能回答「我现在卡在这一层的哪一步」。有一件事要先纠正不少教程把爬虫的知识点分成「基础篇」和「反爬篇」好像学会反爬才算完整。这个划分是错的。爬虫的知识点只分四层——请求、解析、调度、存储合规不是第五层而是贯穿四层的前提。至于「反爬」多数情况下它对应的正确结论是「对方不允许那就不抓」而不是「想个办法绕过去」。本文不涉及任何绕过登录墙、付费墙或风控的内容。本文所有代码以 Python 3 为基准只用标准库。Python 2.7 已于 2020 年 1 月 1 日停止维护print语句、dict.iteritems()、xrange、urllib2这些老写法现在都不能用文中会在对照表里一并点明。一、知识地图层次你要回答的问题常用标准库常见坑请求东西怎么拿下来urllib.request没设 timeout、字节没解码解析数据从哪儿抠html.parser嵌套结构提前收尾调度下一步抓哪儿、抓多少collections.dequeset环状链接无限抓存储数据怎么落盘json/csv编码没写、CSV 多空行合规允不允许抓urllib.robotparser跳过检查直接抓把这张表记住比记二十个 API 有用遇到任何问题先定位它在哪一层。二、请求层要点urllib.request.urlopen(url, dataNone, [timeout, ]*, contextNone)data不为None时变成 POST且必须是字节串。urllib.request.Request(url, dataNone, headers{}, origin_req_hostNone, unverifiableFalse, methodNone)headers等价于逐个add_header(key, val)。设 UA 的目的是表明身份不是伪装。响应对象status整数、headersHTTPMessage可.get()、read()返回字节串、url。它是上下文管理器用with自动释放。字符集resp.headers.get_content_charset(failobjNone)读不到再回退utf-8。压缩自己加了Accept-Encoding: gzip就要自己判断Content-Encoding并用gzip.decompress()。异常urllib.error.URLError是网络错误基类urllib.error.HTTPError是它的子类、代表错误状态码同时是类文件对象有code、reason。异常分类处理404 放弃、403 停止、429 退避、网络错误退避重试。三、解析层要点html.parser.HTMLParser(*, convert_charrefsTrue, scriptingFalse)事件式解析。convert_charrefs从 3.5 起默认True会帮你把字符引用转成对应字符script/style内的除外。三个回调handle_starttag(tag, attrs)、handle_data(data)、handle_endtag(tag)另外还有handle_startendtag(tag, attrs)、handle_comment(data)、handle_decl(decl)。attrs是「(名字, 值) 二元组」的列表不是字典。feed(data)之后一定要close()。官方文档明确它不检查结束标签是否与开始标签匹配也不会为「被外层闭合隐式关闭」的元素调用结束回调。所以嵌套结构要自己用计数器处理。对结构复杂的页面选择器式解析更省事那属于第三方库具体 API 以各库官方文档为准。四、调度与并发要点队列用collections.deque两端进出都是 O(1)去重用set。终止条件要双重既看有没有下一页也设页数/条数硬上限。相对链接用urllib.parse.urljoin(base, href)绝对化去掉片段用urldefrag()。爬虫是 I/O 密集任务。CPython 有全局解释器锁GILGlobal Interpreter Lock同进程内同一时刻只有一个线程执行字节码但等待 I/O 时会释放 GIL所以少量多线程有效CPU 密集要用多进程或 C 扩展。Python 3.13 起有实验性自由线程no-GIL构建但不是默认构建不要说「Python 已经没有 GIL 了」。并发要配限速并发上限保持很小 全局最小请求间隔。不要为了速度去压一个小站点。五、存储与清洗要点文本文件一律显式encodingutf-8。CSV 必须同时newline否则 Windows 上每行之间多一个空行csv文档要求。json.dump(..., ensure_asciiFalse)让中文以汉字写入而非\uXXXX转义。长文本拼接用.join(parts)不要在循环里s s piece。边抓边追加写别把几万条全堆在内存里。六、合规清单写在代码第一行读robots.txtRobotFileParser的set_url→read→can_fetch返回False就不抓。读不到 robots.txt 时按「不允许」处理稍后重试。UA 里写清程序名和联系方式。每次请求之间time.sleep并设总量上限。需要登录、付费或 robots 明令禁止的内容不抓、不绕。遵守著作权与用户协议不把抓来的内容原样再发布。七、Python 2 与版本差异对照老写法Python 2现行写法Python 3说明print htmlprint(html)3 里print是函数urllib2.urlopenurllib.request.urlopen模块在 3 里重组过d.iteritems()d.items()3 里返回视图iteritems已移除xrange(n)range(n)3 的range本身就是惰性的unicode/basestringstr3 里文本统一为str3 / 2 13 / 2 1.5整除写//除法语义变了版本内部的变化也要知道字典从 3.7 起保证插入顺序dict.keys()返回视图而非列表asyncio.get_event_loop()在 3.12 起没有运行中的事件循环时会发DeprecationWarning3.14 起直接抛RuntimeError——新代码应当用asyncio.run()或asyncio.get_running_loop()。实战把知识点串成一个小脚本# 适用于 Python 3.8import csvimport jsonimport timeimport urllib.parseimport urllib.requestimport urllib.robotparserfrom html.parser import HTMLParserUA tutorial-sampler/0.2 (contact: notesexample.org)DELAY 1.0URL https://quotes.toscrape.com/class TextSpanParser(HTMLParser):收集所有 class 含 text 的 span 的文字。def __init__(self):super().__init__()self._in Falseself._buf []self.texts []def handle_starttag(self, tag, attrs):if tag span and text in dict(attrs).get(class, ).split():self._in Trueself._buf []def handle_data(self, data):if self._in:self._buf.append(data)def handle_endtag(self, tag):if tag span and self._in:self._in Falseself.texts.append(.join(self._buf).strip())def fetch_text(url, timeout15):req urllib.request.Request(url, headers{User-Agent: UA})with urllib.request.urlopen(req, timeouttimeout) as resp:charset resp.headers.get_content_charset() or utf-8return resp.read().decode(charset, errorsreplace)def robots_allowed(url):parts urllib.parse.urlsplit(url)robots_url urllib.parse.urlunsplit((parts.scheme, parts.netloc, /robots.txt, , ))parser urllib.robotparser.RobotFileParser()parser.set_url(robots_url)try:parser.read()except Exception:return Falsereturn parser.can_fetch(UA, url)def save(records):with open(quotes.json, w, encodingutf-8) as f:json.dump(records, f, ensure_asciiFalse, indent2)with open(quotes.csv, w, encodingutf-8, newline) as f:writer csv.writer(f)writer.writerow([index, text])for i, rec in enumerate(records, 1):writer.writerow([i, rec[text]])def main():if not robots_allowed(URL):print(robots.txt 不允许抓取退出)returnparser TextSpanParser()parser.feed(fetch_text(URL))parser.close()records [{text: t} for t in parser.texts if t]save(records)print(已保存, len(records), 条)time.sleep(DELAY)if __name__ __main__:main()四十几行代码把请求、解析、限速、合规、存储全部串了一遍。把它当作模板换掉 URL、换掉解析器、换掉落盘格式就是另一个采集任务。常见坑点1. 知识点记住了顺序记反了❌ 先想怎么写并发和解析最后才想起来看 robots.txt。 ✅ 顺序永远是合规 → 请求 → 解析 → 调度 → 存储。2. 把「绕过反爬」当必修课❌ 认为学会验证码识别、指纹伪装才算入门。 ✅ 遇到需要登录/付费/robots 禁止的场景正确结论是不抓。3.convert_charrefs的默认值记错❌ 以为默认是False还自己手工处理字符引用。 ✅ 从 3.5 起默认True大部分实体字符已经帮你转好了。4. 把attrs当字典❌attrs[class]直接下标。 ✅dict(attrs).get(class, )。5. 忘了close()却怪解析器漏数据❌ 只feed()就取值。 ✅feed()后补close()。6. 只设「有没有下一页」这一个终止条件❌ 跟着 next 链接走到天荒地老。 ✅ 再加一个页数/条数硬上限。7. CSV 没写newline❌open(out.csv, w, encodingutf-8)。 ✅open(out.csv, w, encodingutf-8, newline)。8. 把 GIL 说反❌ 「多线程能让 CPU 密集的爬虫变快」。 ✅ 多线程对 I/O 密集有效等 I/O 时释放 GILCPU 密集要用多进程。总结你记住的这句它对应哪一层响应体是字节要按 charset 解码请求attrs是列表feed后要close解析队列 去重 硬上限调度显式编码CSV 加newline存储先can_fetch不允许就不抓合规多线程治 I/O多进程治 CPU并发爬虫的知识点不多难的是把它们组织成一张随时能查的地图。请求、解析、调度、存储四层加上贯穿其中的合规前提就是全部。真正拉开差距的不是 API 记得多而是边界处理得好不好异常怎么分类、循环怎么终止、字段取不到怎么办、什么时候该停手。最后再强调一次没有例外的规则——动手之前先读目标站的 robots.txt。

相关新闻

Python爬虫库urllib的使用教程详解

Python爬虫库urllib的使用教程详解

前言 用 urlopen 发过几个请求之后,很快就会撞到墙:需要走代理怎么办?需要保持 Cookie 怎么办?想统一改掉默认的 User-Agent 怎么办?服务器抽风返回 503,怎么优雅地重试?这些问题都指向同一个东…

2026/10/16 21:51:08 阅读更多 →
从0到上线半天搞定:设计+开发+部署全流程实操拆解

从0到上线半天搞定:设计+开发+部署全流程实操拆解

从 0 到上线:设计加开发,如何半天搞定?经常有朋友问我:接了一个紧急需求,老板说明天就要看到能打开能用的页面,预算就半天时间,到底怎么把设计和开发一起搞定?这个问题我太有发言权了…

2026/10/16 21:51:08 阅读更多 →
OJO Design Skills:让AI生成界面告别模板化,实现设计决策先行

OJO Design Skills:让AI生成界面告别模板化,实现设计决策先行

1. 为什么AI生成的界面总有一股“塑料味”如果你用过AI辅助生成UI代码,大概率见过这种场面:对话框里输入“帮我做一个登录页”,几秒钟后代码哗啦啦吐出来,结构工整、命名规范、注释齐全,但打开预览一看——蓝底白字的按…

2026/10/16 21:51:08 阅读更多 →

最新新闻

exe4j打包Java程序为exe:内置JRE与避坑指南

exe4j打包Java程序为exe:内置JRE与避坑指南

简介:这份资源面向需要将 Java 工程打包为脱离 JDK 环境运行可执行文件的开发者,尤其适合刚接触 exe4j 工具、希望快速完成 jar 转 exe 并排查运行异常的中初级 Java 人员。内容围绕用 exe4j 生成可在未安装 JDK 的机器上直接运行的 exe 文件展开&#x…

2026/10/16 22:31:51 阅读更多 →
MATLAB 2019a找不到VS2017?MEX编译工具链配置与排障指南

MATLAB 2019a找不到VS2017?MEX编译工具链配置与排障指南

1. 为什么MATLAB 2019a默认找不到Visual Studio 2017先交代一下背景。我手头这台机器装的是MATLAB 2019a,系统是Windows 10,电脑里本来就有Visual Studio 2017(C桌面开发组件齐全,这点很关键)。但我在MATLAB命令行里敲…

2026/10/16 22:31:51 阅读更多 →
VoLTE接通率骤降根因:QCI5信令调度与QCI1承载释放冲突解析

VoLTE接通率骤降根因:QCI5信令调度与QCI1承载释放冲突解析

简介:本资源是一份面向通信网络优化工程师与VoLTE运维技术人员的实战型掉话分析技术文档,聚焦4G VoLTE网络中高频掉话问题的根因定位与版本级解决方案。文档系统梳理了异频/异系统重定向掉话、TM3/TM8模式转换异常、X2接口未启用导致跨站重建失败、RLC优…

2026/10/16 22:31:51 阅读更多 →
搞懂Content-Type:HTTP响应头、MIME类型与接口联调避坑指南

搞懂Content-Type:HTTP响应头、MIME类型与接口联调避坑指南

简介:内容类型(Content-Type)是HTTP响应报文中的核心头字段,决定浏览器或客户端如何解析返回的实体内容。这份Word技术文档围绕该主题展开,系统讲解HTTP消息结构、Content-Type的组成格式以及type/subtype/parameter三…

2026/10/16 22:31:51 阅读更多 →
贪心算法四讲:区间选点、最大不相交、区间分组与区间覆盖全解析

贪心算法四讲:区间选点、最大不相交、区间分组与区间覆盖全解析

刷算法题这几年,最怕看到两类题:一类是动态规划,状态转移方程搞死人;另一类就是贪心,思路看着挺对,一提交就WA,看完题解才发现自己漏了个反例。不过贪心里面有个很固定的套路,就是“…

2026/10/16 22:31:51 阅读更多 →
VB.NET串口助手源码解析:SerialPort类与完整调试工具搭建

VB.NET串口助手源码解析:SerialPort类与完整调试工具搭建

简介:vb.net串口助手源码是一份基于VS2010开发的串口通信示例工程,面向需要学习上位机与串口设备交互的VB.NET开发者,尤其适合刚接触串口编程、想通过完整项目快速入门的初学者。工程完整包含窗体界面、事件响应与串口配置逻辑,能…

2026/10/16 22:30:49 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →