python - 尝试在 AWS Lambda 上测试 Scrapy Web-Crawler 时出现此错误“raise error.reactornotrestartable()”
问题描述
我将我的网络爬虫部署到 AWS Lambda。然后在测试时,它第一次运行正确,但第二次出现此错误。在 AWS lambda 中引发 error.reactornotrestartable() twisted.internet.error.reactornotrestartable
File "/var/task/main.py", line 19, in run_spider
reactor.run()
File "/var/task/twisted/internet/base.py", line 1282, in run
self.startRunning(installSignalHandlers=installSignalHandlers)
File "/var/task/twisted/internet/base.py", line 1262, in startRunning
ReactorBase.startRunning(self)
File "/var/task/twisted/internet/base.py", line 765, in startRunning
raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable
爬虫在我的本地 python 环境中运行良好。我试图在 main.py 中运行的函数是这个
def run_spider(event, s):
given_links = []
print(given_links)
for t in event["Records"]:
given_links.append(t["body"])
runner = CrawlerRunner(s)
deferred = runner.crawl('spider', crawl_links=given_links)
deferred.addCallback(lambda _: reactor.stop())
reactor.run()
def lambda_handler(event, context=None):
s = get_project_settings()
s['FEED_FORMAT'] = 'csv'
s['FEED_URI'] = '/tmp/output.csv'
run_spider(event, s)
事件如下所示:
{
"Records": [
{
"body": "https://example.com"
}
]
}
最初,我使用的是 CrawlerProcess 而不是 CrawlerRunner,但它也给出了同样的错误。然后在查看 StackOverflow 上的一些答案后,我将代码更改为使用 CrawlerRunner。有些人还建议使用钩针,我试过了,得到了这个错误:
ValueError: signal only works in main thread in scrapy
我能做些什么来解决这个错误?
解决方案
我在 AWS lambda 上遇到错误ReactorNotRestartable
,在我找到这个解决方案之后
默认情况下,scrapy
Cloud Functions 的异步特性不能很好地工作,因为我们需要一种阻止爬取的方法,以防止函数提前返回并在进程终止之前终止实例。
相反,我们可以使用scrapydo
以阻塞方式运行您现有的蜘蛛:
import scrapy
import scrapy.crawler as crawler
rom scrapy.spiders import CrawlSpider
import scrapydo
scrapydo.setup()
# your spider
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = ['http://quotes.toscrape.com/tag/humor/']
def parse(self, response):
for quote in response.css('div.quote'):
print(quote.css('span.text::text').extract_first())
scrapydo.run_spider(QuotesSpider)
推荐阅读
- java - 使用 Spring Cloud GCP Core 导入凭据时的 Google Cloud KMS 权限问题
- python - 松弛斜线命令图片处理
- pine-script - 为什么我设置数据的周期级别,当我更改图表的显示时间,买卖时间,次数变化时
- macos - AppleScript如何将文件复制到系统路径
- verilog - 我的 Verilog 代码正在编译,没有任何错误 - 它显示“为输出打开了 vcd 文件”,但之后没有输出
- python - 通过将当前进位添加到答案中,下一个“进位”会发生什么?
- java - 在 JSON/Gson 中搜索文本
- android - Kiosk 应用程序,通过推送通知卸载
- primefaces - Primefaces 10 数据导出与子表不工作
- node.js - Twitter推文情绪分析