【问题标题】:How to run scrapy spider inside asyncio even loop?如何在异步甚至循环中运行scrapy spider?
【发布时间】:2019-01-31 18:50:35
【问题描述】:

看来我走到了死胡同。有没有办法在 asyncio 循环中运行 scrapy spider?比如下面的代码:

import asyncio
from scrapy.crawler import CrawlerProcess
from myscrapy import MySpider
import scrapy

async def do_some_work():
    process = CrawlerProcess()
    await process.crawl(MySpider)

loop = asyncio.get_even_loop()
loop.run_until_complete(do_some_work())

这导致我出错:

raise TypeError('A Future, a coroutine or an awaitable is required')
TypeError: A Future, a coroutine or an awaitable is required

我明白在等待之后应该有另一个协程。有什么方法可以绕过它并仍然使其异步工作?谢谢

【问题讨论】:

  • 为什么你认为它可以和 await 一起工作?并非所有方法都可以异步工作。

标签: python scrapy


【解决方案1】:

Scrapy 目前不支持async 语法。

如果您需要在基于异步的代码中运行 Scrapy,您需要 run Scrapy as a script 它,就像在异步函数中运行任何其他同步代码一样。

也就是说,它可能在未来可用。在那个方向有一个Google Summer of Code proposal,还有一个ongoing discussion on the topic

【讨论】:

  • 您能否扩展一下语句:您需要将 Scrapy 作为脚本运行,就像您在异步函数中运行任何其他同步代码一样。这样做到底需要什么?
【解决方案2】:

整个scrapy是同步代码。每当发生阻塞时,没有异步机制(协程)将正在运行的资源转回选择循环。 主要的阻塞是网络请求。库scrapy 使用不支持异步。所以也许你打开scrapy源代码来实现asyncio或aiohttp来替换原来的网络库,这样就可以了。然而,在这些库之上,还有复杂的扭曲模块。 (类似于 asyncio,虽然不如 asyncio 快,因为 python 2)。可能比从头开始使用 asyncio 构建新框架更困难。

【讨论】:

  • 这是不正确的。 Scrapy 使用 Twisted 的事件驱动网络,因此不完全同步。 Source
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2020-09-26
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多