【发布时间】:2020-05-18 13:19:21
【问题描述】:
我将我的网络爬虫部署到 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
我可以做些什么来解决这个错误?
【问题讨论】:
-
这可能是stackoverflow.com/q/42388541/939364 的副本吗?
-
也许,你是对的,但没有一个解决方案在那个链接上对我有用。 sys.exit() 答案终于起作用了,但我想要一些不那么脏的东西。所以,我认为最好再问一次这个问题?如果错了,我很抱歉,我只是这个 StackOverflow 的新手。
-
我个人只是投票赞成原始问题并将其分享到Reddit,询问是否有人能想到更清洁的方法。
标签: python aws-lambda scrapy web-crawler