如何在asyncio事件循环中运行Scrapy爬虫?

5

看起来我走到了死胡同。有没有办法在asyncio循环内运行scrapy爬虫?例如下面的代码:

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之后应该有另一个协程。是否有任何方法可以绕过它,仍然使其异步工作?谢谢。


你为什么认为它可以使用await?并不是所有的方法都可以作为异步工作。 - furas
2个回答

1

你能详细说明一下这个语句吗: 你需要将Scrapy作为脚本运行,就像在异步函数中运行任何其他同步代码一样。具体来说,需要做什么才能实现这一点? - fogx

0
整个Scrapy是同步代码。没有异步机制(协程)来在阻塞发生时将运行资源返回到选择循环中。主要的阻塞是网络请求。Scrapy使用的库不支持asyncio。因此,您可以打开Scrapy源代码以实现asyncio或aiohttp来替换原始网络库,这将起作用。但是,在这些库之上,还有复杂的twisted模块(类似于asyncio,尽管不像asyncio那样快,因为它是Python 2)。可能比从头开始构建一个具有asyncio的新框架更加困难。

2
这不是正确的。Scrapy使用基于Twisted的事件驱动网络,因此不完全同步。来源 - realslimshanky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接