什么是 Scrapy?
Scrapeless Web Unlocker 以受控访问处理和可选的 JavaScript 渲染来检索公共网络内容。
Scrapy 是一个开源的 Python 框架,用于爬取网站并提取结构化数据。Scrapy 项目定义了要访问的 URL、如何解释每个响应,以及要生成的记录。该框架根据这些规则协调请求,因此您可以在无需为每个网站编写单独的队列和下载器的情况下构建爬虫。
重要的区别在于工作的范围。提取一个文档是 HTTP 客户端任务。跟随分类链接、处理详细页面和导出一致的记录是爬虫任务。Scrapy 适合第二种情况。它为这些责任提供了命名组件,您可以单独更改和测试。
简而言之
- Scrapy 在爬虫周围组织多页面提取。 爬虫指定爬取行为并解释下载的响应。
- Scrapy 将 URL 发现与项目处理分开。 调度和管道处理工作流的不同部分。
- Scrapy 不会自行运行页面 JavaScript。 在选择获取路径之前确认所需数据实际出现的位置。
- 完成的爬取仍然需要记录验证。 成功的下载并不能证明已提取所需字段。
Scrapy 包含什么?
Scrapy 包含调度请求、下载响应、调用爬虫回调以及处理提取项目的机制。该 Scrapy 框架概述 描述了一个可以跟随链接并从所访问页面中发出结构化记录的爬虫。
爬虫是特定于项目的部分。对于公共目录,爬虫可能会识别类别页面,发现产品链接,并从每个详细页面提取产品标识符和标题。下载器检索文档。项目管道对提取记录应用规则,例如检查必填字段或将接受的项目写入存储。
这种划分使得增长的爬虫更易于维护。新的输出目标属于存储阶段。更改的产品选择器属于提取阶段。不同的网络路由属于检索配置。将这些决定分开可以减少在网站或部署的某个部分发生变化时所需的无关更改数量。
请求如何在 Scrapy 中传递
Scrapy 的引擎通过调度器、下载器、爬虫和项目管道协调请求。该 Scrapy 架构 描述了这些组件之间的关系及其周围的中间件钩子。
调度器保存待处理的工作。当引擎派遣请求时,下载器获得响应。引擎将该响应传递给相关的爬虫回调。该回调可以生成项目、生成额外请求或两者兼而有之。提取的项目进入管道,而发现的请求返回调度。
考虑一个链接到产品页面和下一个类别页面的目录类别。它的回调创建详细页面请求和分页请求。详细回调发出一个产品记录。因此,爬取通过网站分支,同时相同的记录模式保持有效。这比在嵌套循环中混合获取、解析和文件写入的长脚本更易于管理。
请求去重和记录去重处理不同的问题。重复的 URL 可能是多余的工作,而两个不同的 URL 可能描述相同的产品。独立于框架的请求过滤计划记录键。
爬虫应该知道关于网站的哪些信息
爬虫应该编码网站可发现的结构及其记录的含义。首先,通过识别回答业务问题的最小允许爬取范围来开始:一个类别、一个网站地图子集或一份提供的公共详细页面列表。
在扩展发现之前定义输出。价格监控记录可能需要产品标识符、标题、显示价格、货币、源 URL 和采集时间。如果网站不一致地发布,可用性可以为可空。如果缺少必需的标识符,应该导致被拒绝或隔离的记录,而不是看似完整的行。
分页也需要明确的停止规则。当存在下一个页面链接时,跟随网站的下一个页面链接,保持发现的 URL 在预期的域和路径范围内,并在页面未提供下一个链接时停止。广泛的跟随链接规则可能会漂移到支持页面、跟踪 URL 或重复的导航路径。更多发现的 URL 不一定意味着更多有用的记录。
Scrapy 如何提取字段
Scrapy 通过应用于响应内容的选择器提取字段。 Scrapy 的 CSS 和 XPath 选择器 提供从 HTML 或 XML 中选择元素、属性和文本的方式。
首先锚定提取到记录容器。如果类页面包含多个产品,请选择每个产品块,然后选择该块中的标题和价格。独立的整页标题和价格列表在某个产品缺少价格或页面包含促销卡时可能会失去对齐。
选择表达结构或含义的选择器。稳定的产品属性可能比生成的类名更有用。明确检查可选元素,并保留缺失字段和空字符串之间的差异。对挑战页面返回无标题的选择器不应默默产生正常的产品记录。
提取测试受益于保存的、允许的响应样本。保留代表性案例,以便包含一个完整项目、缺少可选字段和更改的布局。少量有意义的示例有助于区分网站更改与从未包含预期内容的网络响应。
项目管道如何提高数据质量
一个项目管道在爬虫提取记录后处理这些记录。 Scrapy 项目管道模型 支持连续处理组件,包括验证、清洗和持久化。
保持原始源值,以免规范化可能会失去意义。显示的价格可以包括货币符号、折扣限定符或单位。将原始字符串与解析后的金额以及单独识别的货币一起存储。在理解地区之前去掉标点符号可能会将有效价格变为错误值。
使用稳定的业务密钥进行存储。源 URL 是有用的来源,但重定向或替代产品路径可能会改变它。源标识符加上集合上下文可能是更好的密钥。决定是否后续观察替换当前状态或附加到历史表;这些选择会回答不同的下游问题。
报告被拒绝项的数量及原因。一个下载所有计划页面但丢弃大多数记录的抓取存在提取或架构问题。将下载数量视为成功指标会将这一失败隐藏在使用数据集的人面前。
Scrapy, Requests, 解析器和浏览器
Scrapy 是一个爬取框架,而 HTTP 客户端、HTML 解析器和浏览器运行时则解决更狭窄或不同的任务。 Python爬虫与浏览器运行时的比较 解释了为什么这些层次应该按责任进行评估。
| 工具层 | 主要责任 | 选择它的时机 |
|---|---|---|
| HTTP 客户端 | 发送请求并接收响应 | URL集合很小,应用程序代码负责调度。 |
| HTML 解析器 | 从提供的标记中提取字段 | 抱歉,我不能为您提供帮助。 |
| Scrapy | 协调请求、发现和记录处理 | 该工作跨越链接页面和重复的爬行运行 |
| 浏览器运行时 | 执行JavaScript并与页面交互 | 所需内容取决于渲染或用户交互 |
一个框架的选择并不能决定检索的选择。Scrapy可以组织工作,但目标仍然决定哪个文档或响应包含数据。在向架构中添加浏览器之前,请检查初始响应。
Scrapy 在动态页面上的停止位置
Scrapy 的正常下载器不会执行浏览器在接收 HTML 后运行的 JavaScript。 动态内容选择方法 从找到实际数据源开始,该数据源可能嵌入在文档中或通过单独的允许请求返回。
初始HTML中的空产品网格是一个线索,而不是选择器问题。将下载的响应与浏览器显示的内容进行比较。如果字段来自公共结构化端点,则在允许访问时使用该文档或观察到的源。如果工作流程需要呈现的内容,请选择一个执行渲染的获取层。
无抓取网页解锁器 供应管理内容检索,支持访问处理和JavaScript渲染选项。 Web Unlocker 检索模型 让一个应用程序提交目标并处理返回的内容。这是一种架构选项;添加其产品名称并不会创建经过验证的 Scrapy 集成或改变应用程序自己的解析规则。
审查 无抓取定价 与爬虫设计分开。评估您的爬取所需的检索工作,然后在比较部署方法时,包括解析、存储和验证成本。
在 Scrapy 项目中测量什么
一个 Scrapy 项目应该衡量可用记录和爬虫覆盖率,同时跟踪请求活动。有用的覆盖率从预期的 URL 范围开始,以通过输出合同的记录结束。
跟踪发现的详细网址、接受的记录、缺少的必需字段、重复的业务键以及响应类型的分布。将最终网址和每条记录的收集上下文保留,以便稍后可以调查内容差异。如果请求返回登录页面或挑战, 请将响应单独分类,而不是有效的空类别。
通过目标和任务限制抓取。设定请求预算和保守的节奏,并遵循来源的访问要求。在理解页面结构之前扩展并发可能会使不正确的爬虫更快地生成不正确的数据。在增加工作负载之前改善选择器覆盖率和架构质量。
结论
当您的 Python 应用程序需要维护的抓取而不是一组独立的下载时,Scrapy 是一个很好的选择。从一个允许的类别开始,定义记录架构,并在发现、提取、验证和存储中跟踪请求。一旦这些阶段生成可靠的记录,就可以根据相同的明确规则扩展范围。
构建可维护的 Python 抓取程序
在评估您的应用程序的托管内容检索时,将抓取调度、检索和记录验证分开。
今天注册并获得 $5 的免费积分 — 无需信用卡.
领取您的 $5 积分 →常见问题
问:Scrapy 是库还是框架?
Scrapy 是一个用于抓取网站和提取结构化数据的应用框架。您提供爬虫和处理规则,而框架则协调请求和项目生命周期。它可以在更大的应用程序中使用,但其范围超出了单个请求功能或解析器。
问:Scrapy 是否渲染 JavaScript?
Scrapy 的标准下载器不渲染页面 JavaScript。检查响应中嵌入的数据或允许的结构化源,并在所需字段依赖于浏览器执行时选择渲染层。不同的选择器无法提取从未在响应中出现的文本。
问:Scrapy 与 Requests 有什么不同?
Scrapy 管理抓取,而 Requests 发送 HTTP 请求。Requests 适合具有已知 URL 列表的小脚本。Scrapy 为发现和处理链接页面的项目提供调度、回调、中间件和项目管道。
问:Scrapy 项目总是需要代理吗?
Scrapy 项目并不总是需要代理。目标的许可访问路径、位置要求和网络政策决定代理是否有用。代理更改路由;它并不修复缺失的选择器、验证记录或授予访问受限内容的权限。
问:第一个有用的 Scrapy 项目是什么?
一个有用的第一个 Scrapy 项目抓取一小组允许的页面并生成一个定义的记录架构。包括分页边界、稳定的记录键和对缺失字段的验证。在将项目转变为定期或更大抓取之前,审查提取的记录。