Python 网络爬虫教程:请求到 Playwright
Senior Web Scraping Engineer
TL;DR:
- Python网络爬虫是一个带有规则的队列。 它从一个或多个URL开始,规范化发现的链接,拒绝重复项,强制执行范围,并记录每个页面发生的事情。
- Requests和Beautiful Soup是服务器渲染页面的合适基础。 它们保持爬取速度快,并使失败情况容易检查。
- Playwright属于JavaScript分支,而不是每个URL。 只渲染初始响应中缺失所需内容的页面。
- Scrapeless Scraping Browser将浏览器执行移出爬虫进程。 当管理会话和动态渲染成为主要操作成本时,它非常有用。
爬虫决定下一个去向基于它刚刚获取的信息。这使得URL策略、队列状态和去重比任何单一的CSS选择器更为重要。
本教程分层构建设计:对稳定页面使用纯HTTP,对客户端内容使用浏览器渲染,然后在本地Chromium成为限制时使用受管理的浏览器执行。
什么是Python网络爬虫?
Python网络爬虫是通过从种子集跟随链接来发现页面的程序。网络爬取从已知页面提取字段;爬虫发现哪些页面存在并安排它们进行后续处理。
这两项工作通常共享一个进程,但在设计中应该保持分离。发现返回标准URL和关系元数据。提取返回记录,如标题、价格、日期或正文文本。
爬虫管道一览
| 阶段 | 输入 | 输出 | 主要规则 |
|---|---|---|---|
| 种子 | 起始URL | 初始队列 | 使用明确的允许域 |
| 获取 | 标准URL | HTTP响应或渲染页面 | 设置明确的超时 |
| 发现 | HTML文档 | 候选链接 | 解析相对URL |
| 规范化 | 候选URL | 标准URL | 去除片段并规范化主机大小写 |
| 过滤 | 标准URL | 接受或拒绝的URL | 强制执行域、路径和深度范围 |
| 去重 | 接受的URL | 新的队列项或现有记录 | 以标准形式为关键 |
| 提取 | 页面内容 | 结构化记录 | 将可选字段视为可空 |
| 存储 | 记录加来源 | 持久数据集 | 保留源URL和收集时间 |
路径A:对静态页面使用Requests和Beautiful Soup
当初始响应已经包含爬虫所需的链接和字段时,Requests是合适的。然后,Beautiful Soup将HTML转换为可搜索的树。
使用双端队列进行广度优先遍历,使用集合存储已访问的标准URL,并设置硬页面限制。使用urljoin解析相对链接,然后在解析后检查主机名。URI通用语法定义了相对引用和片段如何适应URL模型。
不要在成功获取之后才标记URL为已访问。应在进入队列时标记;否则两个父页面可以在任何请求完成之前安排相同的子页面。
在去重之前规范化URL
URL规范化决定/products、/products#reviews和等效绝对URL是否成为一个爬取目标或三个。一个保守的规范化器应该:
- 将方案和主机名转换为小写;
- 删除片段;
- 解析
.和..路径段; - 删除默认端口;
- 除非其意义已知,否则保留查询参数;
- 在调度之前拒绝非HTTP方案。
WHATWG URL标准记录了现代浏览器实现的解析器行为。保持规范化的保守,因为删除未知的查询参数可能会合并不同的资源。
强制执行范围、深度和爬取预算
爬虫在发送第一个请求之前需要明确的停止规则。定义允许的主机、接受的路径前缀、最大深度和最大页面数。深度是从种子出发的链接边数,而不是站点层次结构的代理。
将发现的父项存储在每个队列项中。这创建了一个URL图,有助于解释为什么访问了某个页面,并使无限的日历或分面导航模式变得可见。
使用Scrapeless开始爬取
使用Scrapeless增强您的网络爬取和自动化工作流程!
今天注册并获得5美元的免费信用 — 无需信用卡。立即在Scrapeless仪表板上申请您的免费信用。
尊重机器人和网站政策
机器人指令是爬取规划的一部分,而不是事后补充。机器人排除协议定义了爬虫如何发现和解释robots.txt规则。
检查适用的条款和法律,确定合适的爬虫,并将收集限制在允许的公共页面内。机器人规则不是授权机制,因此允许的路径并不能替代法律和合同审查。
路径 B:JavaScript 页面上的 Playwright
当所需链接或字段仅在客户端执行后出现时,使用 Playwright。 在证明初始响应不完整后,将这些页面路由到浏览器分支。
将 domcontentloaded 作为起始导航事件,然后等待与数据相关的特定页面状态。 Playwright 定位器指南 建议使用角色、标签、文本和其他与用户相关的属性,当它们与目标匹配时。
提取后关闭每个页面和浏览器上下文。 浏览器资源不应与轻量级 HTTP 请求处于同一无界循环中。
何时将浏览器执行移动到 Scrapeless
Scrapeless Scraping Browser 在爬虫的浏览器分支需要管理会话、地理路由和生产浏览器能力时非常有用。 Scraping Browser 快速入门 涵盖当前连接路径。
保持爬虫的队列、URL 规则、提取架构和存储在应用程序控制之下。 仅移动浏览器执行层。 这种分离使静态页面保持在 Requests 上,而动态页面使用受管理的浏览器。
存储爬网状态以便恢复
将排队、进行中、完成、拒绝和失败状态分别持久化。 存储规范 URL、发现父级、深度、获取方法、响应状态、内容哈希和解析器版本。
内容哈希可以防止未更改的页面再次进入下游处理。 解析器版本使得当选择器更新更改历史输出时,可以追踪架构更改。
在衡量实际需要浏览器执行的页面份额后,查看 Scrapeless 定价。 Scraping Browser 最佳实践指南 解释了在页面跨越该边界后如何可靠地操作支持浏览器的工作。
结论
可靠的 Python 爬虫是一个受控的 URL 图谱。 从 Requests 和 Beautiful Soup 开始,在去重之前进行规范化,在调度之前执行范围控制,只将依赖 JavaScript 的页面通过 Playwright 或 Scrapeless Scraping Browser 路由。
准备构建受控爬网管道吗?
加入在 Discord 或 Telegram 上构建网络数据管道的开发者。 在 app.scrapeless.com 创建一个帐户,并测量浏览器分支与您真实 URL 集的对比。
常见问题
问:爬网和抓取有什么区别?
爬网用于发现和调度页面;抓取从页面中提取字段。 一个管道可以同时执行两者,但分开的状态和输出使操作更容易。
问:网络爬虫合法吗?
当访问允许的公共页面时,网络爬虫可以是合法的,但要求因管辖权和网站而异。 请审核适用的条款、隐私义务和法律建议,以满足用例。
问:Python 爬虫需要代理吗?
当授权收集需要地理路由或分布式出口时,代理是有用的。 这并不会改变爬虫遵守范围和政策的义务。
问:爬虫应如何处理访问被拒绝页面?
将页面记录为一种独特的访问结果,停止该 URL 的提取,并在继续工作流之前检查会话、出口和授权假设。
问:当 DOM 发生变化时会怎样?
重新检查发现和提取选择器与保存的固件,更新解析器版本,并将缺失字段视为可为空,直到确认新架构。
问:爬虫应该使用多少并发?
每个主机最多开始不要超过三个工作者,并在网站政策或服务器行为要求时降低限制。 浏览器作业应使用单独的、更紧凑的容量池。
问:爬虫可以在没有 AI 代理的情况下运行吗?
可以。 队列、URL 策略、HTTP 客户端、浏览器分支和存储管道可以作为普通的 Python 服务运行,而无需模型。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



