什么是网页爬取?Python 分步教程

网络爬虫 是指从网站自动收集信息。 在本教程中,你将构建一个 Python 抓取器,用于提取 20 个书名、价格、库存详情和产品链接,然后将它们保存到 CSV 文件中。具备基础的 Python 知识会有所帮助,但你不需要有过往的抓取经验。
2025 年,自动化系统生成了超过 53% 的网络流量,根据 Imperva 2026 恶意机器人报告。如今许多网站会以速率限制、CAPTCHA、浏览器检测和 IP 信誉控制来应对自动化请求。
当抓取器从练习网站转向更大规模或特定地区的项目时,干净的代理会很有帮助。 NodeMaven 的 网页抓取代理 提供预先过滤的住宅 IP、灵活的轮换、粘性会话以及精准的地理定位,从而减少失败的请求并采集更稳定一致的结果。本教程会展示代理在爬虫中的适用位置,而不会在它们尚未成为必需之前就提前加入。
什么是网页抓取,它是如何工作的?
网页抓取工具会访问某个页面,并从其 HTML 中提取选定的信息。 爬虫无需手动复制产品价格或文章标题,而是自动找到每个字段并保存下来。
一个基本的抓取流程包含六个阶段:
- 向某个 URL 发送 HTTP 请求。
- 下载页面的 HTML。
- 将 HTML 解析为可搜索的结构。
- 使用 CSS 选择器或 XPath 找到所需的元素。
- 提取并清理它们的内容。
- 将记录保存为 CSV、JSON 或数据库。
简而言之:网站 URL -> HTTP 请求 -> HTML 响应 -> CSS 选择器 -> 选中的数据 -> CSV 文件。
假设一家在线商店将商品标题放在 h2 元素内,而将价格放在带有 .price 类的元素内。抓取程序可以在每个商品页面上找到这些元素,并将它们转换为电子表格中的行。
网页抓取、爬取与数据挖掘
网络爬行(web crawling)和网络爬取(web scraping)经常出现在同一个项目中,但它们的工作各不相同。 爬虫负责发现页面。抓取工具则从这些页面中提取选定的字段。
例如,爬虫可能会找到 10,000 个产品 URL。随后,抓取工具会从每个页面收集标题、价格、卖家、评分和库存状态。
数据挖掘会对收集到的数据集进行分析 以发现模式、异常或做出预测。以下对比 数据挖掘与网页抓取 说明了每个流程的适用位置。
静态页面与 JavaScript 渲染的页面
静态页面会在服务器返回的 HTML 中包含所需信息。 Requests 和 BeautifulSoup 等 Python 库通常就能处理这些情况。
由 JavaScript 渲染的页面会在首次请求之后才加载内容。 请求可能会收到 HTML,但其中并不包含浏览器中可见的产品、评论或列表信息。 Playwright 和 Selenium 通过打开浏览器、运行页面脚本并从渲染后的页面中提取数据来解决这个问题。
先从一次普通的 HTTP 请求开始,并检查响应。如果响应中已经包含所需字段,那么使用浏览器只会带来额外的内存占用和更慢的页面加载。当内容只有在 JavaScript 运行之后、页面滚动或用户操作发生时才出现,才改用浏览器自动化。
开发者在这方面也给出了相同的建议 关于从脚本迁移到抓取基础设施的讨论:先从 Requests 和 BeautifulSoup 入手,只有在目标网站确实需要时才加入 Playwright。
如何用 Python 抓取网站
本示例使用 Books to Scrape,一个为抓取练习而创建的演示电商网站。该抓取器会采集:
- 书名
- 价格
- 可用性
- 产品链接

完成的记录会保存到 books_to_scrape_products.csv。你可以通过更换 URL 和 CSS 选择器,将同样的流程套用到另一个静态网站上。
第 1 步:确定要收集哪些数据
打开 Books to Scrape 并检查一张商品卡片。在编写抓取程序之前先确定所需的字段。
对于另一个网站,这些字段可能包括产品名称、SKU、折扣价、卖家、评分或评论数量。先写下这份清单可以避免脚本收集项目并不需要的字段。
第 2 步:查找 CSS 选择器
打开 Books to Scrape 在 Chrome 中打开。右键点击第一本书的标题并选择 检查.
Chrome DevTools highlights the title’s <a> 元素。该元素包含抓取工具所需的两个值:
标题包含完整的书名。href包含产品链接。
要复制其选择器:
- 右键点击高亮的
a元素。 - 打开 复制.
- 选择 复制选择器.

- 对价格和库存情况重复此过程。
Chrome 可能会返回一个仅指向第一本书的冗长选择器。相反,爬虫会先选中每一个重复的书籍卡片,然后在每张卡片内部查找所需的字段。
使用以下选择器:
| Data | CSS 选择器 |
|---|---|
| 商品卡片 | article.product_pod |
| 书名 | h3 a |
| 价格 | .price_color |
| 可用性 | .availability |
| 产品链接 | h3 a |
该脚本使用 article.product_pod 以找到全部 20 张图书卡片。在每张卡片内部, h3 a 用于查找标题和链接,而 .price_color 和 .availability 找到其余字段。
第 3 步:搭建 Python 项目
创建项目文件夹:
在 macOS 或 Linux 上,创建并激活一个虚拟环境:
在 Windows PowerShell 上,使用:
安装所需的软件包:
Requests 负责下载 HTML。BeautifulSoup 对其进行解析,并使用 CSS 选择器查找元素。
创建一个空文件,命名为 books_scraper.py 位于项目文件夹内。
在 macOS 上:
对于 Linux:
在 Windows PowerShell 上:
保持空文件处于打开状态。第 4 步到第 8 步将在其中构建爬虫。
第 4 步:下载页面
将以下代码粘贴到空白的 books_scraper.py 文件:
requests.get() 下载页面。超时机制可防止脚本无限期地等待下去,而 raise_for_status() 报告 HTTP 错误。
UTF-8 设置对于 Books to Scrape 是正确的,可以防止英镑符号被错误解码。 不要盲目地将此设置照搬到每个项目中。 在覆盖 Requests 检测到的值之前,先检查目标网站声明的编码。
若要抓取另一个网站,请替换 URL 替换为其页面地址。
保持文件打开并继续进行第 5 步。抓取脚本尚未完成。
第 5 步:解析 HTML
在第 4 步代码的正下方,将响应转换为 BeautifulSoup 对象:
找到每一张图书卡片:
select() 返回与该 CSS 选择器匹配的每个元素。 Books to Scrape 应在第一页返回 20 张卡片。
如果结果是 0,检查响应的 HTML 并核对选择器。该网站也可能通过 JavaScript 加载其产品。
第 6 步:提取产品字段
在第 5 步代码的正下方,创建一个空列表并遍历这些卡片:
保持四个空格的缩进,位于 适用于 循环。Python 使用缩进来确定针对每本书应运行哪些指令。
该爬虫使用 get("title") 因为书名存储在一个 HTML 属性中。价格和库存以标签之间的文本形式出现,因此脚本使用 get_text().
这些回退值可以防止某个缺失字段导致整个任务停止运行。它们还能让缺失的数据在 CSV 中清晰可见。
第 7 步:构建完整的产品链接
Books to Scrape 使用相对链接,例如:
将这段代码紧接在可用性代码下方添加。保持缩进四个空格,因为它属于同一个 适用于 loop:
生成的 URL 为:
仍在循环内,将完成的记录添加到列表中:
每个字典对应 CSV 中的一行。
第 8 步:将数据保存为 CSV
在循环之后添加以下代码。启动 fieldnames 位于左边缘且不缩进,以便 Python 知道循环已经结束:
Python 的 CSV 文档 建议用以下工具打开 CSV 文件: newline=""。该 utf-8-sig 编码有助于 Excel 及类似应用程序正确显示英镑符号。
抓取器文件现已完成。保存 books_scraper.py 再运行它。
步骤 9:运行并检查抓取器
在虚拟环境仍处于激活状态时返回终端。运行该文件:
终端应显示:
检查以下各项:
- 该 CSV 包含 20 个产品。
- 标题和价格显示在正确的列中。
- 货币符号可正常显示。
- 产品链接会打开预期的页面。
在 macOS 上,使用以下方式打开该 CSV:

在 Windows 上,打开 books_scraper 文件夹,然后双击 books_to_scrape_products.csv.
第 10 步:当目标网站需要时添加代理
Books to Scrape 不需要代理。当一个已获批准的抓取项目需要特定地区的结果、会话连续性,或需要处理超出单个 IP 可靠承载能力的请求量时,代理就会派上用场。
在此示例中,创建一个 NodeMaven 住宅代理,并设置所需的地区: 控制面板。为独立页面选择轮换模式,或者当分页、cookie 或相关请求必须保持在一起时选择粘性会话。选择 HTTP 并复制生成的用户名和密码。
请将凭据存储在环境变量中,而不是直接写在 Python 文件里。
在 macOS 或 Linux 上:
在 Windows PowerShell 上:
添加 os 到 import 语句中,并包含 quote 在 URL 工具中:
用以下内容替换原始请求:
Requests 在其以下位置支持这种带身份验证的代理格式 官方代理文档。对凭据进行编码可以防止诸如以下字符 @ from breaking the proxy URL.
保存更新后的文件,然后再次运行: python books_scraper.py。抓取器现在将通过所选的 NodeMaven 代理发送其请求。
仅在允许自动化访问的场景下使用代理。 代理并不能修复损坏的选择器、渲染 JavaScript,也不能为过高的请求频率开脱。
如何将抓取工具适配到其他网站
要复用该抓取器:
- 替换页面 URL。
- 找到重复出现的产品或列表卡片。
- 替换卡片和字段选择器。
- 检查每个值是以文本形式还是以 HTML 属性形式出现。
- 更新 CSV 列名。
- 运行脚本,并将其输出与可见页面进行对比。
当所需数据出现在下载的 HTML 中时,Requests 和 BeautifulSoup 就能胜任。由 JavaScript 渲染的网站可能需要 Playwright 或 Selenium。
该 ChatGPT 网页抓取指南 通过分页、重试、调试和浏览器渲染扩展了这个示例。
网页抓取技术与工具
合适的方法取决于网站如何加载数据、涉及的页面数量,以及项目能够承担多少维护工作。
| 方法 | 最适合 | 主要限制 |
| 手动采集 | 来自某一页面的若干条记录 | 速度慢且难以重复执行 |
| 浏览器扩展 | 小型可视化抓取任务 | 控制和自动化能力有限 |
| Requests 和 BeautifulSoup | 静态 HTML 页面 | 无法渲染 JavaScript |
| Scrapy | 更大规模的抓取和定时任务 | 需要更多配置 |
| Playwright 或 Selenium | JavaScript 与浏览器交互 | 占用更多资源 |
| 数据采集 API | 托管式渲染与请求处理 | 额外的成本和更少的自定义控制权 |
Requests 和 BeautifulSoup 是理想的入门选择,因为代码easy一目了然。Scrapy 则提供请求队列、并发控制、数据管道和任务调度,适合更大规模的抓取任务。
Playwright 当数据只有在 JavaScript 运行、页面滚动或用户点击某个控件之后才会出现时,它就非常有用。当维护自定义抓取器的成本高于使用某项服务时,无代码工具和抓取 API 可以节省时间。本指南关于 网页抓取工具 对比了主要选项。
网络抓取有什么用途?
当信息需要反复采集,或涉及的页面数量超出一个人手工合理处理的范围时,网络抓取就非常有用。
电子商务与价格监控
零售商会收集公开价格、折扣、库存状态、配送预计时间、评分和新品发布信息。每日运行的抓取工具可以记录竞争对手的价格变动,为定价分析、库存规划或促销跟踪提供支持。
该 价格抓取指南 讲解了这些系统如何组织定价数据。Amazon 需要额外的准备,因为价格、库存和配送详情可能会因地区而异;有关以下内容的指南 抓取 Amazon 介绍了该工作流程。
新闻与搜索监控
新闻抓取器会收集标题、发布日期、分类、作者以及文章 URL。它们可以支持媒体监测和市场调研。定时抓取器可能每小时重新访问一次归档,并只存储新发布的文章。本指南将说明如何 爬取新闻网站 而不会反复采集相同的文章。
搜索监测采用类似的流程来收集排名、精选摘要、本地结果和竞争域名。由于搜索结果因地区而异,爬虫需要请求正在衡量的目标市场,而不是依赖其服务器所在的位置。
社交与社区研究
公开的社交媒体数据可用于趋势监测、受众研究和品牌追踪。这些平台通常使用 JavaScript、身份验证、速率限制及其他访问控制手段,因此一个基础的 Requests 抓取器可能会收到登录页面或不完整的响应。
实际需求因平台而异。NodeMaven 提供了单独的指南来 抓取 Twitter 并构建一个 Reddit 抓取工具.
网页抓取合法吗?
网页抓取并不天然地就合法或违法。 答案取决于所在司法辖区、所收集的信息、访问方式,以及这些数据将如何使用。
在抓取网站之前:
- 检查它是否提供官方 API。
- 查看其服务条款。
- 阅读它的 robots.txt 文件。
- 未经授权,请勿获取私密或需登录才能访问的信息。
- 要考虑版权、数据库权利和隐私法律。
- 将请求速率保持在足够低的水平,以避免干扰服务。
- 对于商业项目或高风险项目,请寻求法律咨询。
该 机器人排除协议(Robots Exclusion Protocol) 规定了网站如何在 robots.txt 中发布爬取指令。它同时指出,这些规则并不构成访问授权。被允许访问的路径并不能解决版权、隐私、合同或计算机访问法律方面的问题。
指南主题 网页抓取的合法性 更详细地介绍了这些问题。
如何让抓取工具保持稳定可靠
HTTP 响应成功并不能证明抓取器收集到了正确的信息。 真实的网站会改变其布局,以 200 OK 状态返回拦截页面,偶尔还会无响应。
验证提取出的字段
定义每条有效记录必须包含的字段。一条产品记录可能需要标题、价格、产品 ID 和规范 URL。如果缺少其中某个字段,就记录该 URL,而不是保存一条不完整的行。
同时检查响应中是否包含 CAPTCHA 文本、访问被拒绝消息、登录页面以及空白的产品网格。
谨慎重试临时性失败
超时以及 429、502 或 503 响应可能只是暂时的。可以重试两到三次,每次尝试后适当延长等待时间。将仍然失败的 URL 移入一个单独的队列,而不是让爬虫陷入无限循环。
A 2025 年关于网页抓取的研究论文 说明超时和速率限制会在收集到的数据中造成非随机的缺口。如果一个价格抓取程序漏抓某一类别的频率高于其他类别,那么即使每一行保存的数据都正确,其最终的平均值也可能具有误导性。
监控每一次运行
跟踪采集到的记录数量、字段缺失率、重复数量、重试次数、拦截页面检测次数以及响应时间。如果某个任务通常返回 500 个商品,却突然只返回 12 个,请停止导出并检查失败的页面。
保存响应的 HTML;对于基于浏览器的任务,还应在提取失败时保存一张截图。这些文件有助于区分是选择器失效,还是遇到了拦截页面或 JavaScript 问题。
代理在网页抓取中的用处
用于练习的抓取工具或在开放网站上运行的小型任务可能不需要代理。 当项目需要区域化结果、稳定的会话,或请求量大到某个 IP 开始遭遇速率限制时,它们就会派上用场。
Apify 的住宅代理文档 解释道,住宅流量更难与普通用户流量区分开来。其 数据中心代理指南 建议先从更快、更便宜的数据中心代理开始,当目标网站大量拦截主机托管网络时,再改用住宅地址。
类似的问题也出现在这个 网页抓取开发者之间的讨论。有一个抓取工具在本地运行正常,但迁移到 VPS 后立即被封禁。评论者指出了 数据中心 ASN、浏览器指纹和自动化请求模式都是可能的原因。他们建议使用住宅 IP,同时放慢请求速度并优化浏览器配置。
选择 轮换 用于独立的 URL。使用 一个粘性会话 当多个请求共享 cookie、分页状态或位置设置时。
为什么选择 NodeMaven 进行网页抓取
一个廉价的代理如果反复返回 CAPTCHA 或屏蔽页面,就会造成更多重试,并在数据集中留下缺口。
NodeMaven 会预先筛选住宅 IP,并为拥有严格 IP 信誉检查的网站提供干净的代理。它的功能与常见的抓取任务直接对应:
- 轮换 将产品页面、商品列表或搜索请求分散到不同的 IP 上。
- 最长可持续 24 小时的粘性会话 保留 cookie、分页状态和地区设置。
- 按国家/地区、城市、ISP 和 ZIP 定位 支持区域价格、库存和搜索结果的收集。
- 支持 HTTP 和 SOCKS5 可与 Requests、Scrapy、Playwright 及其他抓取工具配合使用。
- 一个套餐即含住宅与移动流量 允许在两种网络类型上进行测试。
例如,价格抓取工具可以在不同的独立商品 URL 之间轮换 IP,同时让每个请求都绑定到所需的城市或 ZIP 邮编。符合条件的代理问题也在 NodeMaven 的质量保证和返现条款覆盖范围之内。
启动 NodeMaven 代理试用 以便在扩展爬虫规模之前测试目标、地区和会话设置。
一个实用的起点
第一个项目建议在 Books to Scrape 这类练习网站上使用 Requests 和 BeautifulSoup。在加入分页、重试、浏览器渲染或代理之前,先确认选择器能返回预期的记录。当所需内容依赖 JavaScript 时使用 Playwright;只有当项目确实需要区域测试、会话连续性或更大规模的数据采集时,才引入代理。请查阅网站的规则并校验提取到的数据,而不要把一次成功的请求就当作抓取程序运行正常的证明。



