Joh*_*ews 3 python scrapy google-cloud-platform google-cloud-functions
我正在尝试使用 Google Cloud Functions 发送多个抓取请求。但是,我似乎收到了错误ReactorNotRestartable。从 StackOverflow 上的其他帖子(例如这篇文章)中,我了解到这是因为无法重新启动反应器,特别是在执行循环时。
解决这个问题的方法是把start()for循环放在外面。但是,对于云功能,这是不可能的,因为每个请求在技术上都应该是独立的。
是否以CrawlerProcess某种方式使用 Cloud Functions 进行缓存?如果是这样,我们如何消除这种行为。
例如,我尝试将导入和初始化过程放在函数内部而不是外部,以防止缓存导入,但这不起作用:
# main.py
def run_single_crawl(data, context):
from scrapy.crawler import CrawlerProcess
process = CrawlerProcess()
process.crawl(MySpider)
process.start()
Run Code Online (Sandbox Code Playgroud)
默认情况下,异步特性scrapy不能很好地与云函数配合使用,因为我们需要一种方法来阻止爬行,以防止函数提前返回并在进程终止之前终止实例。
相反,我们可以使用scrapydo以阻塞方式运行现有的蜘蛛:
requirements.txt:
scrapydo
Run Code Online (Sandbox Code Playgroud)
main.py:
scrapydo
Run Code Online (Sandbox Code Playgroud)
这还展示了一个简单的示例,说明如何scrapy.Item从蜘蛛中产生一个或多个并从爬行中收集结果,如果不使用,这也将具有挑战性scrapydo。
另外:确保您的项目启用了计费功能。默认情况下,Cloud Functions 无法发出出站请求,爬虫会成功,但不返回任何结果。
| 归档时间: |
|
| 查看次数: |
641 次 |
| 最近记录: |