Scrapy的Zyte自动提取API集成
项目描述
此库通过两种不同的方式将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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9fef8bd4508c962c464183187e6d22f1dfa3935ab8cd136018b6f3c11c579b18 |
|
MD5 | 49d24899e835a8655596aed0f64d96ca |
|
BLAKE2b-256 | 497b9f44a01a74de46c0792a198762df91f15eb17df7d2ad51085a6cbecb4c6b |
scrapy_autoextract-0.7.0-py2.py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 9b116ddb44ff885c3dbfd066dd2fe9360cf01d3fa102f07d869064b739b32d9b |
|
MD5 | 96f3f81315ad9b46c5c389990a3cf850 |
|
BLAKE2b-256 | 87b23bc66f8f5079fadc84821030dacbea6349265113579ee57cd1eae2942bbe |