行业资讯
📅 2026/8/30 11:21:26
Python网络爬虫零基础入门:从HTTP请求到数据存储的完整路线
2026年了Python 网络爬虫这条学习路线其实已经非常成熟成熟到不再需要纠结“学哪个库”“用什么框架”。但每年还是会有大量新人跑过来问我照着教程写了一个爬虫为什么只成功了一次换个网站就失效为什么网页源码里能看到的文字用 requests 拿到之后却找不到为什么别人说爬虫很简单我却连环境都装不对这些问题的共同根源不是代码写得不够花而是基础流程没建立起来。这篇文章要给的不是一段临时能跑通的代码而是一套从零开始、可以迁移到其他网站的爬虫思维和操作流程。开篇先给一个判断零基础入门 Python 网络爬虫真正要学的不是某个高深算法而是三个基本功——HTTP 请求的理解、HTML 结构的解析、数据存储与异常处理。学完这三块你能解决 80% 以上静态网页采集场景。无论你现在用的 Python 是 3.10 还是更新一点的稳定版本本文讲的思路都完全适用。我会先用概念帮你把原理补上再带你把环境装好最后用一个公开的练习网站手写一个能翻页、能保存数据的完整爬虫并解释运行失败后每一步应该怎么查。1. 这篇文章真正要解决的问题1.1 为什么爬虫值得零基础开始学先看清楚一个事实爬虫不只是“程序员的玩具”它其实已经进入很多不同岗位的日常工作。数据分析师需要用脚本从公开页面收集行业数据比如商品价格、论文列表、招聘信息后端开发需要对接外部站点提供的接口但有些站点没有开放 API只能解析页面运维人员会写定时爬虫做站点状态监控、内容变更通知运营同学也会用简单脚本批量整理竞品的公开信息。这些场景不需要你成为爬虫专家但需要你能写“可运行、可维护、不惹麻烦”的爬虫。更重要的是爬虫能给你带来一种“把网络变成数据”的掌控感。很多人学 Python 的第一个正反馈就来自爬虫因为它不需要先啃完一本语法书也不用等到“学好了再开始”。你只要会基本的循环、函数和列表操作就能写出第一个有效果的小脚本。把一个网页上的内容自动下载到本地这种即时反馈比任何练习题都更能支撑你坚持学下去。1.2 为什么很多人学了一半就放弃市面上大多数入门教程给你看的是“三行代码抓网页”import requests resp requests.get(https://quotes.toscrape.com/) print(resp.text)这段代码确实能跑但它掩盖了爬虫真正的复杂度。真实项目里你需要处理的不是“正常路径”而是各种异常网站返回 403、登录后跳转、内容延迟加载、字段为空、编码错乱、网络超时、服务器主动断开连接。如果你只会最小演示代码一旦遇到这些情况就完全不知道从哪里下手。所以本文的路线是先讲基础原理再搭环境再写完整代码最后给一个可复用的排查清单。这样你学到的不是“万能代码”而是“遇到问题怎么定位、怎么改”。小结论可以浓缩成一句零基础学爬虫最大的坑是“只看代码不学流程”而流程恰恰是最能复用的部分。代码会随网站结构变化失效但请求、解析、存储、异常处理这个思考框架不会过期。你养成的调试习惯和日志敏感性才是未来能走多远的分水岭。2. 基础概念与核心原理爬虫看起来高深拆开看无非是对浏览器行为的一次“自动化模拟”。你在浏览器里做四件事输入网址发起请求等待服务器返回页面用眼睛看、用鼠标选中需要的信息把内容复制粘贴到表格。爬虫做的事情完全一样只是把每一步变成了代码。理解这四步你就理解了爬虫的整体架构。2.1 HTTP 请求与响应当程序向一个网址发送请求时本质是在和服务器说请把某个资源给我。浏览器如此requests 库也如此。一次请求主要包含几个要素请求方法GET 用于获取内容POST 通常用于提交表单或登录URL要请求的资源地址请求头包括 User-Agent、Referer、Cookie 等用来告诉服务器“我是谁、从哪来”请求体POST 请求会携带参数。服务器处理之后返回响应响应里最需要关注的是状态码。状态码不用全部背下来但下面几个必须认识状态码含义爬虫中常见原因200请求成功正常301/302重定向链接变化需要跟踪重定向403禁止访问缺少请求头、被识别为爬虫404页面不存在URL 写错429请求过于频繁访问速度太快被限流500/502/503服务端错误网站本身出问题或正在保护2.2 HTML、DOM 与解析服务器返回的页面通常是 HTML。HTML 用标签描述内容结构比如div classquote span classtext“人生苦短我用 Python。”/span spanby 某位作者/span /div解析 HTML 的目标就是从这些标签中提取出我们关心的文本或属性。最常用的工具是 BeautifulSoup它把 HTML 转换成一棵可遍历的树可以通过标签名、class、id 等条件筛选节点。你可以把它理解成一种“精确复制粘贴”告诉程序你要哪个区块里的哪段文字程序就帮你取出来。2.3 静态页面与动态页面的区别这一点必须区分清楚否则你会遇到很多奇怪的问题。静态页面指需要的数据直接写在 HTML 源码里你用 requests 拿到的 text 里就有。动态页面则相反服务器先返回一个空壳数据由 JavaScript 在浏览器里发请求后渲染出来。你用 requests 直接拿 text可能页面结构看着完整但真正的内容一个都找不到。动态页面的解决方案一般有两种思路找页面背后的 JSON 接口直接请求或者用 Playwright、Selenium 这类工具驱动真实浏览器。本文示例使用静态页面先把基础流程跑通动态页面会在文章最后的学习方向里给出建议。2.4 爬虫的合规边界学习阶段一定要培养合规意识。不同网站对自动采集的态度不同建议至少做到三条第一查看网站是否提供 robots.txt 文件例如练习站点的https://quotes.toscrape.com/robots.txt第二控制请求频率不要对目标服务器造成压力第三只采集公开、合法、不涉及个人隐私的数据。本文不使用任何绕过反爬的技术只讲正常请求范围内的入门实践。3. 环境准备与前置条件开始写代码前先把环境一次性配好后面会省很多事。很多新手学爬虫失败其实不是代码问题而是 Python 和第三方库的安装环节就没走通。所以这一节请耐心看完。3.1 安装 PythonPython 官方下载页面提供了各平台安装包。安装时注意几个关键点Windows在安装向导第一页务必勾选“Add Python to PATH”不然命令行里找不到 python 命令安装完成后在命令行执行python --version验证。macOS可以直接下载官方安装包也可以使用 Homebrew 安装。Linux部分发行版自带 Python 3但版本可能不是最新不过不影响本文示例。不要在 Python 2 和 Python 3 之间犹豫。现在所有主流库都已支持 Python 3如果学习时发现教程让你用 Python 2请直接换教程。你选择的 Python 3 大版本只影响少数新语法特性requests 和 BeautifulSoup 的用法在近几个版本里几乎没有变化完全可以沿用本文代码。3.2 创建虚拟环境虚拟环境可以避免不同项目的依赖互相影响。比如你项目 A 需要 requests 2.20项目 B 需要 requests 3.0如果都装进同一个系统环境迟早会出现版本冲突。虚拟环境把每个项目的依赖隔离开是工程上必须养成的习惯。在项目目录中执行mkdir python-crawler-demo cd python-crawler-demo python -m venv venv启动虚拟环境Windowsvenv\Scripts\activatemacOS/Linuxsource venv/bin/activate命令行出现(venv)前缀说明虚拟环境已激活。3.3 安装依赖库本文核心库只有三个requests 负责发送 HTTP 请求beautifulsoup4 负责解析 HTMLlxml 是解析器速度和稳定性比默认的 html.parser 更好。执行pip install requests beautifulsoup4 lxml如果想顺便把数据直接用 Pandas 做后续分析可以再加一个pip install pandas如果 pip 安装很慢可以临时指定国内镜像源例如pip install requests beautifulsoup4 lxml -i https://pypi.tuna.tsinghua.edu.cn/simple3.4 IDE 选择新手建议使用 PyCharm 或 VS Code两者免费可用也都能方便地管理虚拟环境。PyCharm 社区版创建项目后可以自动创建虚拟环境调试功能很直观VS Code 需要安装 Python 扩展配置更轻量。在 IDE 中打开刚才创建的项目目录确认右下角或解释器设置里选择的解释器是venv里的那个否则运行时会提示找不到 requests 模块。3.5 练习网站的选择教学示例里非常推荐一个专门给爬虫练习的站点https://quotes.toscrape.com/它页面结构稳定、没有复杂登录、内容是公开名言每页有 10 条数据并且支持翻页。用这个站点练习既不会给目标网站带来压力也能完整覆盖“请求—解析—翻页—存储”的流程。等你熟练掌握之后再尝试其他公开页面时重点要做的就是把 URL 规则和解析选择器换成新的。4. 核心流程拆解在真正写代码之前先把爬虫项目拆开。不要用“发送请求、解析数据、保存数据”一句话带过每一步都有细节这些细节才是决定代码能不能稳定运行的关键。4.1 分析目标页面拿到一个页面后先打开浏览器开发者工具按 F12。你要确认三件事目标数据是否直接存在于 HTML 源码中每条数据对应的标签结构是什么翻页时 URL 怎么变化。以 quotes.toscrape.com 为例第一页是https://quotes.toscrape.com/第二页是https://quotes.toscrape.com/page/2/第三页就是/page/3/规律非常明显翻页只要替换数字。4.2 构造请求requests.get 发送请求时建议至少带上 User-Agent。很多服务器会拦掉“没有浏览器身份标识”的请求因为正常的浏览器请求一定会携带这个字段。同时设置超时很有必要否则程序可能因为目标服务器无响应而一直卡在那里你只能手动中断进程。合理的写法是HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } resp requests.get(url, headersHEADERS, timeout10)4.3 解析页面把 HTML 文本交给 BeautifulSoup然后用选择器定位数据所在节点。最常见的方式是 CSS 选择器比如div.quote表示所有 class 为 quote 的 div 节点。每一条名言卡片就是一个这样的节点遍历它就能提取出需要的信息。4.4 提取数据拿到每个 quote 节点后再用 select 或 find 提取名言、作者、标签等字段。注意.get_text()可以去除标签最好配合.strip()清理首尾空格。标签字段如果有多个可以用列表推导式一次取完。4.5 存储数据最简单的存储方式是写 CSV 或 JSON。写入 CSV 时建议使用utf-8-sig编码这样用 Excel 打开中文不会乱码保存 JSON 时设置ensure_asciiFalse中文才能以可读形式保留下来。数据量小的时候这两种方式完全够用。4.6 异常处理和频率控制爬虫一定会遇到网络抖动和服务器限制所以请求必须加异常处理并在每两次请求之间休眠一小段时间。完整思路是使用try/except捕获 requests 异常单次失败后重试两到三次每次请求之间 sleep 一到两秒遇到 403 或 429 状态码时暂停人工检查是否访问过快或被限制。5. 完整示例与代码实现从这一节开始我们手写一个爬虫项目。目标是从 quotes.toscrape.com 爬取前 10 页的名言、作者和标签保存到 CSV 文件。代码不搞花活但结构足够扩展。5.1 文件结构python-crawler-demo/ ├── venv/ ├── spider.py └── quotes.csv新建spider.py后面所有代码都写在这个文件里。下面按照函数拆分方便你理解每一段的作用也方便以后增加新功能。5.2 第一步获取单页内容先写一个函数负责请求单页并返回解析后的 BeautifulSoup 对象# 文件路径python-crawler-demo/spider.py import time import requests from bs4 import BeautifulSoup HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } BASE_URL https://quotes.toscrape.com/page/{}/ def fetch_page(page_number): url BASE_URL.format(page_number) resp requests.get(url, headersHEADERS, timeout10) resp.raise_for_status() return BeautifulSoup(resp.text, lxml)raise_for_status()的作用是如果状态码不是 200 系列直接抛出异常方便我们第一时间发现问题而不是带着错误页面继续解析。5.3 第二步解析单页数据解析逻辑放在单独的函数里这样主程序只负责翻页和保存职责更清晰def parse_page(soup): data [] quote_nodes soup.select(div.quote) for node in quote_nodes: text node.select_one(span.text).get_text(stripTrue) author node.select_one(small.author).get_text(stripTrue) tag_nodes node.select(a.tag) tags [tag.get_text(stripTrue) for tag in tag_nodes] data.append({ text: text, author: author, tags: |.join(tags) }) return data这里把多个标签用|拼成一个字符串是为了方便写入 CSV。如果你更希望保留列表结构可以直接在 JSON 里保存 tags 列表两种方式按使用场景选择。5.4 第三步翻页并保存到 CSV主程序负责控制翻页范围、调用解析函数、控制访问频率和保存结果import csv def save_to_csv(rows, filenamequotes.csv): with open(filename, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnames[text, author, tags]) writer.writeheader() writer.writerows(rows) def main(): all_data [] for page in range(1, 11): print(f正在抓取第 {page} 页 ...) soup fetch_page(page) page_data parse_page(soup) all_data.extend(page_data) time.sleep(1) save_to_csv(all_data) print(f完成共保存 {len(all_data)} 条数据到 quotes.csv) if __name__ __main__: main()这里的关键点有三个range(1, 11)控制抓取 1 到 10 页time.sleep(1)限制请求频率encodingutf-8-sig保证中文在 Excel 中正常显示。如果你把范围改成 21内容会继续往后翻页直到 100 多条数据抓完。5.5 加入异常处理与重试上面代码在正常网络环境能跑通但为了让爬虫更“抗造”建议把请求部分改成带重试的写法。重试的意义在于网络抖动频繁出现只要恢复后继续请求就能拿到数据没必要让整个程序崩溃def fetch_page_with_retry(page_number, retries3): url BASE_URL.format(page_number) for attempt in range(retries): try: resp requests.get(url, headersHEADERS, timeout10) resp.raise_for_status() return BeautifulSoup(resp.text, lxml) except requests.RequestException as e: print(f第 {page_number} 页第 {attempt 1} 次请求失败{e}) if attempt retries - 1: time.sleep(2) return None然后在主函数里判断如果 fetch_page_with_retry 返回 None就跳过当前页避免整体中断造成“一页失败全部白跑”的结果。5.6 可选同时保存一份 JSONCSV 适合表格化展示JSON 更适合保留嵌套结构比如每个名言还是多个标签组成的列表。只需要加一小段import json def save_to_json(data, filenamequotes.json): with open(filename, w, encodingutf-8) as f: json.dump(data, f, ensure_asciiFalse, indent2)调用后名言和标签的原始结构都能保留后面做数据分析时更灵活。建议你两组代码都跑一遍观察 CSV 和 JSON 的可读性差异这能帮你以后在选存储格式时做出更合理的判断。6. 运行结果与效果验证在项目目录下执行python spider.py预期输出类似正在抓取第 1 页 ... 正在抓取第 2 页 ... ... 完成共保存 100 条数据到 quotes.csv如何判断成功命令行没有抛异常quotes.csv文件存在用文本编辑器或 Excel 打开能看到名言、作者、标签三列中文不乱码。如果打开 CSV 看到一堆类似é的怪异字符说明编码问题重新确认是否使用了utf-8-sig。如果运行失败第一步排查顺序是看命令行报错信息是网络异常、解析异常还是文件写入异常确认虚拟环境有没有激活IDE 当前解释器是否指向 venv单独请求一页并打印响应状态码确认是不是 200如果是 403检查 User-Agent 是否设置正确。7. 常见问题与排查思路下表是初学者最常遇到的几个问题。遇到问题不要慌爬虫的排错思路和普通软件开发完全一样先定位是哪一层出错网络层、解析层还是存储层。问题现象可能原因排查方式解决方案打印 resp.text 出现中文乱码页面编码不是 UTF-8requests 默认按响应头解码错误打印resp.encoding查看页面 meta 中的字符集手动指定resp.encoding utf-8或用resp.apparent_encoding让 requests 自动判断请求返回 403服务器识别出是程序访问检查请求头是否完整尤其是 User-Agent在 headers 中补充浏览器常见请求头不要绕过有明确限制的站点HTML 源码里能看到数据但 BeautifulSoup 提取为空列表选择器写错或者页面结构经过 JavaScript 渲染先在浏览器开发者工具里确认目标节点的真实 class 名称用soup.find做一次最小测试先用一条数据验证选择器程序卡住不返回没有设置超时服务器长时间无响应查看是否卡在 requests.get所有请求都加 timeout并给请求加重试逻辑打开 CSV 中文乱码写入编码不是 Excel 常见格式用文本编辑器查看文件编码写入时使用utf-8-sig爬取中途被网站限流请求频率过高查看请求日志中是否有 429 状态码调大time.sleep间隔降低并发学习阶段单线程即可pip 安装库失败网络问题或权限问题查看具体报错信息换国内镜像源或确认当前环境是否可以正常访问外网动态页面拿不到数据数据由 JavaScript 加载打开开发者工具 Network 面板查看 XHR 请求优先寻找 JSON 接口或学习 Playwright 驱动浏览器8. 最佳实践与工程建议8.1 合法合规是第一条学习爬虫的第一课不是代码而是边界。不要爬取需要登录才能看到的非公开信息不要采集个人隐私数据不要对没有公开 API 且服务条款禁止自动抓取的网站发起高频请求。如果拿不准先看robots.txt和网站相关说明。很多人对 robots.txt 有误解以为它是一个“法律文件”。实际上它是网站用来自动告知爬虫“哪些路径不允许抓取”的声明。虽然不是所有网站都严格执行但学习阶段养成查看 robots.txt 的习惯能让你在数据合规意识上领先大多数人。8.2 请求头尽量模仿真实浏览器最小请求头至少包含 User-Agent更完整的还可以加 Accept、Accept-Language。这些不是“绕过反爬”而是让请求在 HTTP 协议层面看起来像一个正常访客属于网络请求本身的常规做法。真正有严格限制的站点大概率还需要处理 Cookie、签名等机制这些内容不建议在入门阶段触碰。8.3 请求频率必须可配置把休眠时间抽成常量甚至放到配置文件里会是一个好习惯REQUEST_INTERVAL 1 # 单位秒别人阅读你代码时能一眼看到访问策略比把数字藏在代码中间好得多。学习阶段爬虫运行时间很短但如果你以后写定时任务一个可配置的请求间隔能有效防止自己不小心给对方服务器造成压力。8.4 数据要清洗和去重爬下来的数据不能直接假装是干净的。常见清洗步骤去掉首尾空白过滤空字符串去掉重复记录统一时间格式把嵌套字段展开或规范成统一结构。去重最直接的方式是记录主键集合比如名言文本加作者seen set() if (text, author) not in seen: seen.add((text, author)) rows.append(item)这个小技巧能避免你重复抓取同一页内容时数据文件里出现大量重复行。8.5 日志比 print 更适合长期运行print 只适合学习阶段。如果爬虫要定时运行建议使用 Python 的 logging 模块输出时间、级别、页码和异常信息。以后出了问题日志能帮你反推原因。print 输出一多终端里根本分不清哪条是警告、哪条是错误。8.6 不要做的事很多“高级爬虫教程”会教绕过验证码、破解登录、伪造签名。这些内容不仅违反网站规则也可能触碰法律红线。入门阶段应专注合法公开数据源把基础打扎实。如果工作中确实有合规需求正确做法是询问网站是否有公开 API 或商务合作渠道。爬虫能力的价值不在于“能破解谁”而在于“能在规则之内稳定、高效地提取数据”。8.7 什么时候才需要框架requests 写的单脚本适合学习和中小型采集。当需要管理几十个爬虫任务、处理复杂调度、增量更新、失败重连、去重持久化时才应该考虑 Scrapy 这类框架。它内置了爬虫引擎、调度器、中间件、管道能帮你规范工程结构。但零基础阶段不建议直接学 Scrapy先把 requests 加 BeautifulSoup 这套流程跑明白理解它解决的问题再进入框架会有更深的体会。9. 总结与后续学习方向到这里你已经走完了一条完整的零基础入门路线从 HTTP 原理、环境配置到 requests 请求页面、BeautifulSoup 解析数据再到翻页存储、异常处理和合规意识。这套流程不依赖某个具体网站你把它迁移到其他静态页面时只需要改 URL 和解析规则。这就是“流程”和“代码”最本质的区别。接下来值得继续深入的方向有四个。第一是动态页面与真实浏览器学习 Playwright 或 Selenium理解等待条件、选择器和浏览器上下文可以处理需要 JavaScript 渲染的页面。第二是爬虫框架与调度学 Scrapy 的 Item、Pipeline、Downloader Middleware理解爬虫框架如何解决工程化问题也顺便了解分布式爬虫的基本思路。第三是数据处理学 Pandas 清洗数据把采集结果接入分析、可视化或报表流程。第四是合规与伦理阅读网站 robots.txt 和数据授权协议建立正确的数据获取观念这会在你未来的数据相关工作中形成重要优势。建议把文章中的示例代码亲手敲一遍不要复制粘贴就完事。你可以先跑通再拆掉重写比如改成爬取 20 页、增加去重、改成输出 JSON。真正让你入门的不是这篇文章而是你动手修 bug 的那几个小时。建议收藏备用也欢迎在实践后带着具体报错信息回来对照排查表格。