首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当尝试在AWS Lambda上测试Scrapy Web-Crawler时,得到这个错误"raise error.reactornotrestartable()“

当尝试在AWS Lambda上测试Scrapy Web-Crawler时,得到这个错误"raise error.reactornotrestartable()“
EN

Stack Overflow用户
提问于 2020-05-18 21:19:22
回答 1查看 205关注 0票数 2

我将我的网络爬虫部署到了AWS Lambda。然后在测试时,它第一次正确运行,但第二次出现此错误。在AWS lambda中引发error.reactornotrestartable() twisted.internet.error.reactornotrestartable

代码语言:javascript
复制
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中运行的函数如下

代码语言:javascript
复制
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)

其中事件如下所示:

代码语言:javascript
复制
{
  "Records": [
    {
      "body": "https://example.com"
    }
  ]
}

最初,我使用的是CrawlerProcess而不是CrawlerRunner,但它也给出了相同的错误。然后,在浏览了StackOverflow上的一些答案后,我更改了代码以使用CrawlerRunner。有些人还建议使用Crochet,我尝试了一下,得到了这个错误:

代码语言:javascript
复制
ValueError: signal only works in main thread in scrapy

我能做些什么来解决这个错误?

EN

回答 1

Stack Overflow用户

发布于 2021-08-06 10:16:33

我在AWS lambda上遇到了错误ReactorNotRestartable,在我得到这个解决方案之后

默认情况下,scrapy的异步特性不能很好地用于云函数,因为我们需要一种方法来阻止爬行,以防止函数提前返回,并在进程终止之前终止实例。

相反,我们可以使用scrapydo以阻塞的方式运行现有的爬行器:

代码语言:javascript
复制
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)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61870496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档