跳转到主要内容

Scrapy的Zyte自动提取API集成

项目描述

PyPI Version Supported Python Versions Build Status Coverage report

此库通过两种不同的方式将Zyte的AI启用自动数据提取集成到Scrapy蜘蛛中

  • 使用下载中间件,将AutoExtract响应注入到response.meta['autoextract'],供蜘蛛消费。

  • 使用scrapy-poet提供者,将响应作为回调参数注入。

安装

pip install scrapy-autoextract

scrapy-autoextract需要Python 3.6+用于下载中间件,以及Python 3.7+用于scrapy-poet提供者

用法

使用此库有两种不同的方式来消费AutoExtract API

  • 使用我们的Scrapy中间件

  • 使用我们的页面对象提供者

中间件

中间件是可选的,可以通过请求元信息 {'autoextract': {'enabled': True}} 显式启用。所有以下选项都可以在项目设置文件中设置,或者仅针对特定蜘蛛,在 custom_settings 字典中设置。

在蜘蛛内部,使用 AutoExtract 结果就像这样做:

def parse(self, response):
    yield response.meta['autoextract']

配置

在设置文件中添加 AutoExtract 下载器中间件

DOWNLOADER_MIDDLEWARES = {
    'scrapy_autoextract.AutoExtractMiddleware': 543,
}

注意,这应该是最后一个要执行的下载器中间件。

提供者

另一种使用 AutoExtract API 的方法是使用由 web-poet 库提出的 Page Objects 模式,并由 scrapy-poet 实现。

Page Objects 返回的项目由 autoextract-poet 库定义。

在蜘蛛内部,使用 AutoExtract 结果就像这样做:

import scrapy
from autoextract_poet.pages import AutoExtractArticlePage

class SampleSpider(scrapy.Spider):
    name = "sample"

    def parse(self, response, article_page: AutoExtractArticlePage):
        # We're making two requests here:
        # - one through Scrapy to build the response argument
        # - the other through the providers to build the article_page argument
        yield article_page.to_item()

注意,在上面的示例中,我们将执行两个请求

  • 一个通过 Scrapy 进行(它可能使用智能代理、Splash 或不使用代理,具体取决于您的配置)

  • 另一个通过 AutoExtract API 使用 zyte-autoextract

如果您不需要通过 Scrapy 进行额外的请求,您可以在回调函数的响应参数上添加 DummyResponse 注解。这将忽略 Scrapy 请求,并且仅获取 AutoExtract API。

例如

import scrapy
from autoextract_poet.pages import AutoExtractArticlePage
from scrapy_poet import DummyResponse

class SampleSpider(scrapy.Spider):
    name = "sample"

    def parse(self, response: DummyResponse, article_page: AutoExtractArticlePage):
        # We're making a single request here to build the article argument
        yield article_page.to_item()

上面的示例从页面中提取了一篇文章,但您可能希望提取不同类型的条目,例如产品或招聘信息。这就像在回调中使用正确的类型注解一样简单。如果我们需要从页面中提取房地产,回调将看起来像这样

def parse(self,
          response: DummyResponse,
          real_estate_page: AutoExtractRealEstatePage):
    yield real_estate_page.to_item()

如果您需要的是原始浏览器 HTML 以提取一些额外的数据,您甚至可以使用 AutoExtractWebPage。访问 支持的页面类型完整列表 以获得对支持页面的更好了解。

配置

首先,您需要按照 scrapy-poet 的文档 中的说明配置 scrapy-poet,然后将以下代码放入 Scrapy 的 settings.py 文件中以启用 AutoExtract 提供者

# Install AutoExtract provider
SCRAPY_POET_PROVIDERS = {"scrapy_autoextract.AutoExtractProvider": 500}

# Enable scrapy-poet's provider injection middleware
DOWNLOADER_MIDDLEWARES = {
    'scrapy_poet.InjectionMiddleware': 543,
}

# Configure Twisted's reactor for asyncio support on Scrapy
TWISTED_REACTOR = 'twisted.internet.asyncioreactor.AsyncioSelectorReactor'

目前,我们的提供者是使用 asyncio 实现的。Scrapy 自 2.0 版本以来已引入了 asyncio 支持,但截至 Scrapy 2.3 版本,您需要手动通过配置 Twisted 的默认 reactor 来启用它。有关更多信息,请参阅 Scrapy 的 asyncio 文档

清单

  • scrapy-poet 已安装,且下载器/注入器中间件已配置

  • autoextract-poet 已安装(页面输入是从该库导入的)

  • 提供者在 settings.py 中已配置

  • Scrapy 的 asyncio 支持在 settings.py 中已启用

现在您应该准备好使用我们的 AutoExtract 提供者了。

异常

在尝试获取 AutoExtract API 时,提供者可能会引发一些异常。这些异常可能来自 scrapy-autoextract 提供者本身,zyte-autoextract,或其他方式(例如 ConnectionError)。例如

  • autoextract.aio.errors.RequestError:当返回 请求级错误 时引发

  • scrapy_autoextract.errors.QueryError:当返回 查询级错误 时引发

请参阅 zyte-autoextract 的异步错误 以获取其他异常定义。

您可以使用错误回调(errback)捕获这些异常

import scrapy
from autoextract.aio.errors import RequestError
from autoextract_poet.pages import AutoExtractArticlePage
from scrapy_autoextract.errors import QueryError
from scrapy_poet import DummyResponse
from twisted.python.failure import Failure

class SampleSpider(scrapy.Spider):
    name = "sample"
    urls = [...]

    def start_requests(self):
        for url in self.urls:
            yield scrapy.Request(url, callback=self.parse_article,
                                 errback=self.errback_article)

    def parse_article(self, response: DummyResponse,
                      article_page: AutoExtractArticlePage):
        yield article_page.to_item()

    def errback_article(self, failure: Failure):
        if failure.check(RequestError):
            self.logger.error(f"RequestError on {failure.request.url}")

        if failure.check(QueryError):
            self.logger.error(f"QueryError: {failure.value.message}")

请参阅Scrapy 文档以获取更多关于如何使用请求的errback捕获异常的详细信息。

设置

中间件设置

  • AUTOEXTRACT_USER [必填] 是您的AutoExtract API密钥

  • AUTOEXTRACT_URL [可选] AutoExtract服务的URL。默认为autoextract.scrapinghub.com。

  • AUTOEXTRACT_TIMEOUT [可选] 设置AutoExtract的响应超时。默认为660秒。也可以通过设置request.meta中的“download_timeout”来定义。

  • AUTOEXTRACT_PAGE_TYPE [必填] 定义要提取的文档类型。当前可用的选项有“product”“article”。也可以在spider.page_type{'autoextract': {'pageType': '...'}}请求元中定义。这对于AutoExtract分类器知道需要提取哪种类型的页面是必需的。

  • extra [可选] 允许向AutoExtract请求发送额外的有效负载数据。必须指定为{'autoextract': {'extra': {}}}请求元,并且必须是一个字典。

  • AUTOEXTRACT_SLOT_POLICY [可选] 下载并发选项。默认为SlotPolicy.PER_DOMAIN - 如果设置为SlotPolicy.PER_DOMAIN,则考虑设置SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.DownloaderAwarePriorityQueue'以更好地使用AutoExtract并发性并避免延迟。

提供者设置

  • AUTOEXTRACT_USER [可选] 是您的AutoExtract API密钥。如果未设置,则从ZYTE_AUTOEXTRACT_KEY环境变量中获取。

  • AUTOEXTRACT_URL [可选] AutoExtract服务的URL。默认为官方AutoExtract端点。

  • AUTOEXTRACT_MAX_QUERY_ERROR_RETRIES [可选] 查询级别错误的最大重试次数。默认为0

  • AUTOEXTRACT_CONCURRENT_REQUESTS_PER_DOMAIN [可选] 每个域的最大并发请求数。如果未设置,提供者将查找CONCURRENT_REQUESTS_PER_DOMAIN(默认为8)设置。

  • AUTOEXTRACT_CACHE_FILENAME [可选] 将放置在.scrapy文件夹中的.sqlite文件的名称。如果不存在,则创建文件。缓存对开发很有用;当使用提供者时,AutoExtract请求绕过标准Scrapy缓存。

限制

当使用AutoExtract中间件时,有一些限制。

  • 入站蜘蛛请求由AutoExtract渲染,而不仅仅是被Scrapy下载,这可能会改变结果 - IP地址不同,头部信息不同等。

  • 仅支持GET请求

  • 不支持自定义头部和cookies(即设置它们的功能不工作)

  • 不支持代理(它们会在Scrapy和AutoExtract之间工作不正确,而不是在AutoExtract和网站之间)

  • AutoThrottle扩展对于AutoExtract请求可能无法正常工作,因为AutoExtract的时间可能会远大于下载页面所需的时间,因此最好在设置中使用AUTHTHROTTLE_ENABLED=False

  • 重定向由AutoExtract处理,而不是由Scrapy处理,因此这些中间件可能没有效果

  • 使用Scrapy中间件时,可以将429错误作为标准重试处理,但与scrapy-poet集成时可以正确且自动处理,因为它依赖于zyte-autoextract。您可能会丢失一些使用中间件方法时的响应。

  • 总体来说,与scrapy-poet集成后,重试行为更佳,它包括对自动查询级别错误重试的支持,无需更改RETRY_HTTP_CODES

  • 不支持AutoExtract特定的缓存(AUTOEXTRACT_CACHE_FILENAME

当使用AutoExtract提供者时,请注意

  • 在使用scrapy-poet集成时,重试请求不会通过Scrapy

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

scrapy-autoextract-0.7.0.tar.gz (26.8 kB 查看哈希值)

上传时间

构建分布

scrapy_autoextract-0.7.0-py2.py3-none-any.whl (26.4 kB 查看哈希值)

上传时间 Python 2 Python 3

支持者