什么是Scrapy?Python爬虫框架解释

什么是Scrapy?

无抓取的通用抓取API可以作为需要在提取之前获取或渲染内容的Scrapy工作流的获取源。

TL;DR

  • Scrapy是一个用于爬取和结构化提取的Python框架。 它协调请求、调度、下载、解析回调、项处理和出口,所有这些都在一个可扩展的运行时内。
  • 爬虫描述了特定于源的行为。 爬虫生成初始请求、解析响应、发出项目并遵循允许的继续链接。
  • 引擎连接每个组件。 请求和响应通过调度器、下载器、中间件、爬虫和管道边界传递,而不是通过一个单一的庞大脚本。
  • 选择器使用CSS或XPath。 Scrapy响应暴露查询方法,这些方法返回选择器对象并将字段提取保持在解析的响应附近。
  • Scrapy不会自动渲染每一页。 动态内容仍然需要一个支持浏览器的下载路径、一个允许的结构化端点或预渲染的HTML。

Scrapy是一个爬虫框架

Scrapy是一个开源的Python框架,用于获取页面、提取结构化字段、跟踪链接、处理项目和导出结果。它比HTML解析器要大,比围绕HTTP客户端的循环要更有组织。当一个项目有许多页面、延续规则、共享请求策略、可重用的项目逻辑或计划运行时,该框架变得有用。

官方Scrapy文档 描述了爬虫、选择器、请求和响应、项目管道、数据导出、中间件、扩展、调度和部署实践。一个项目开始时可能只使用一个小子集,随着重复逻辑的出现而添加组件。

一个好的Scrapy项目将源知识保留在爬虫中,而将可重用的策略保留在其他地方。爬虫知道从哪些页面开始以及如何解读它们。下载器中间件处理交叉请求和响应行为。项目管道清理、验证、去重或存储输出。

Scrapy数据如何在系统中移动

Scrapy的执行引擎协调流动。该 架构概述 显示请求从爬虫移动到调度器,通过下载器中间件到下载器,响应则回到中间件再到爬虫。然后项目传递给项目管道,而新发现的请求返回到调度器。

组件主要责任保持远离它
爬虫请求、解析、延续共享存储和全局传输策略
调度器队列和请求排序字段提取
下载器网络获取业务规范化
中间件可重用的请求或响应钩子一次性选择器规则
项目管道验证、清理、持久性链接发现
数据导出写入标准输出格式特定于源的页面逻辑

这些边界防止每个爬虫重新发明传输、去重和输出。它们还使故障更容易定位。下载问题属于爬虫回调之前。缺少标题属于解析或验证。数据库错误属于项目已经结构化之后。

Scrapy爬虫的作用是什么

爬虫是一个定义要发送哪些请求以及如何处理其响应的Python类。 官方蜘蛛指南 解释请求和回调周期:启动请求被下载,回调解析响应,回调生成项目或更多请求。

以下块是一个本地运行时的前提,因为当前工作区未安装 Scrapy。其结构遵循文档化的 Spider API。请在专用环境中运行,并使用允许采集的公共目标。

import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example_page"
    allowed_domains = ["example.com"]
    start_urls = ["https://example.com/"]

    def parse(self, response):
        title = response.css("h1::text").get()
        href = response.css("a::attr(href)").get()

        if not title or not href:
            raise ValueError("expected page identity is missing")

        yield {
            "title": title.strip(),
            "url": response.urljoin(href),
            "source_url": response.url,
        }

蜘蛛在产生之前验证其身份字段。 response.urljoin 将链接解析为实际的响应 URL。在目录中,回调应遍历记录容器并相对于每个容器运行子选择器。

选择器、项目和管道有各自的工作

选择器从响应中读取字段。项目或普通字典表示提取的数据。管道在提取后操作。将这些任务分开可以让项目对已保存的响应进行选择器测试,并使用普通的 Python 值测试归一化。

使用 CSS 进行简洁的结构查询,当某个字段依赖于祖先、兄弟或文本关系时则使用 XPath。保持必需字段的明确性。缺失的稳定 ID 或规范 URL 应拒绝该项目;可选的副标题可以保持为空。数据管道不应猜测爬虫从未观察到的缺失源值。

  • 蜘蛛拥有页面特定的知识。 翻译文本如下: 规则: 1. 仅输出翻译文本 - 不需要解释,不需要额外的包装代码围栏。 2. 精确保留Markdown/HTML结构(标题、列表、链接、表格)。 3. 保持任何占位符标记如@@CODEBLOCK_0@@或@@INLINECODE_0@@完全不变;绝不要翻译、重新排序、合并或重新格式化它们。 4. 不要添加或删除```代码围栏,且不要将普通文本包装在代码块中。 URLs、选择器和继续规则应接近源。
  • 中间件拥有重复的传输行为。 只有在政策真实共享的情况下,才会在所有蜘蛛上应用。
  • Pipelines 自有记录政策。 验证、标准化、去重,并在提取后持久化。
  • 饲料出口涵盖简单存储。 在没有明确需求的情况下,使用内置的 JSON 或 CSV 输出,而不是编写自定义持久层。

知道何时Scrapy是合适的规模

Scrapy 在工作有许多页面、多只爬虫、共享策略、管道、可观察性或重复执行时形成其结构。单页提取可能更清晰,作为请求加上一个解析器。小步开始并不是失败;当协调成为主要问题时,转向框架是有用的。

Scrapy 默认也不是一个浏览器。如果所需的值在响应正文中缺失,并且仅在页面脚本运行后出现,则选择器无法恢复这些值。请使用返回渲染的 HTML、经过授权的结构化源或当交互是任务一部分时的浏览器工作流程。

控制爬虫范围和继续

allowed_domains 是一个有用的防护,但项目范围也应该定义允许的方案、路径模式、查询行为和页面预算。在去重之前规范化 URL,以便跟踪参数和备用形式不会增加队列。

续件应在经过验证的下一链接或光标后进行。当源移除该信号时,爬虫可以停止。仅有空项目并不能证明完成,因为错误的页面、已更改的选择器或客户端渲染的壳也可能导致无结果。

导出并观察爬虫

饲料导出是以标准格式写入项目输出的最简单方法。当记录需要验证、去重、数据库写入或特定于源的转换时,管道是合适的。将拒绝项目的原因和网络诊断与业务记录分开。

跟踪请求、响应类、页面身份失败、选择器遗漏、产出项目、拒绝项目和队列深度。该 HTTP 语义规范 澄清了响应状态,但页面身份检查仍然是必要的,因为成功的响应仍然可能是一个无关的文档。

仅为共享策略添加中间件和扩展

下载器中间件适用于多个爬虫需要相同请求或响应行为的情况。爬虫中间件属于爬虫输入和输出的范畴。扩展观察框架信号并实现跨项目行为,例如指标或操作限制。一次性选择器修正不属于这些全局层次中的任何一个。

从拥有规则的最小组成部分开始。如果一个蜘蛛需要一个标题或解析分支,就保持在那里,直到该行为在其他地方重复并具有相同的含义。过早的全局挂钩会使项目更难以推理,因为请求可能在远离创建它的蜘蛛的地方发生变化。

文档排序当多个中间件类启用时。每个钩子应具备一个责任,并返回下一个阶段所期望的框架类型。测试应在组件边界断言请求或响应,而不仅仅是最终导出的行。

通过物品处理保持来源

一个项目在进入管道之前应携带其规范源 URL 和稳定源标识符。管道可以添加获取时间、解析器修订和批次标识,然后强制唯一性或存储政策。这些字段让下游用户区分真实源变更和蜘蛛部署。

规则: 1. 仅输出翻译文本——没有解释,没有额外的包装代码框。 2. 精确保留Markdown/HTML结构(标题、列表、链接、表格)。 3. 保持任何占位符令牌如@@CODEBLOCK_0@@或@@INLINECODE_0@@完全不变;绝不要翻译、重排、合并或重新格式化它们。 4. 不要添加或删除```代码框,且不要将普通文本包装成代码块。 当规范化可能失去意义时保留原始值。货币、本地化数字、人类日期和可用性标签需要源意识转换。将规范值存储在足够的原始上下文旁边以审计决策,并拒绝违反已声明模式的组合。

结论

Scrapy是一个用于协调爬虫的框架,而不仅仅是一个解析器。它的引擎、调度器、下载器、中间件、爬虫、管道和导出给每个关注点提供了一个清晰的归属。当排队和可重复性很重要时,使用这种结构,将特定于页面的选择器保留在爬虫中,在生成项目之前验证身份,只在源需要的地方添加呈现的获取。

准备将 Scrapy 连接到渲染的内容吗?

保留 Scrapy 的调度程序、爬虫和管道,同时 Scrapeless 处理需要渲染文档的页面的获取。

今天注册并获取 $5 的免费积分无需信用卡.

领取您的 $5 积分 →

常见问题

Scrapy 用于什么?

Scrapy 用于爬取允许的网站页面,提取结构化记录,跟踪继续链接,处理项目,并在可重复的项目中导出或存储结果。

Scrapy 和 BeautifulSoup 一样吗?

不一样。BeautifulSoup 主要是一个解析器,而 Scrapy 是一个带有请求、调度、下载、回调、中间件、管道和导出的爬虫框架。

Scrapy 可以抓取 JavaScript 网站吗?

Scrapy 选择器可以解析渲染后的 HTML,但默认的 HTTP 路径不会执行页面 JavaScript。添加一个兼容的渲染获取层或使用授权的结构化源。

Scrapy 支持 CSS 选择器和 XPath 吗?

是的。Scrapy 响应公开了 CSS 和 XPath 的选择器方法,两种样式可以在每种清晰表达字段的地方使用。

什么时候 Scrapy 太庞大了?

对于没有队列、管道或重复计划的一两页静态页面,Scrapy 可能比必要的要大。一个小的 HTTP 客户端加上解析器可能更适合那个范围。

参考文献