在Google Cloud Function中运行Scrapy爬虫

5

我目前正在尝试让Scrapy在Google Cloud Function中运行。

from flask import escape
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

def hello_http(request):
    settings = get_project_settings()

    process = CrawlerProcess(settings)
    process.crawl(BlogSpider)
    process.start()

    return 'Hello {}!'.format(escape("Word"))

这个方法可以用,但是很奇怪,并不总是有效。每隔一段时间,HTTP调用会返回一个错误,然后我可以在堆栈驱动器上阅读到: 函数执行花费了 509 ms,状态为:"崩溃" 我检查了蜘蛛,甚至简化了它,使其无法失败,例如:
import scrapy

class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['https://blog.scrapinghub.com']

    def parse(self, response):
        yield { 'id': 1 }

有人能解释一下发生了什么吗?

可能是我达到了资源配额限制吗?

这里输入图片描述


我没有看到你的第一个代码块与第二个代码块有什么关系。BlogSpider 在云函数中被使用在哪里了? - Dustin Ingram
是的,抱歉,那只是一个打字错误。我已经修复了它。 - TKrugg
3
我一直在尝试重现你的问题,就我所看到的,第一次运行函数时,一切都如预期般工作。再执行一次该函数后,我发现出现了以下错误:twisted.internet.error.ReactorNotRestartable。据我所知,这似乎是因为每个进程只有一个反应器,您不能启动它两次。我发现您可以尝试实现类似于这样的方法。希望能对您有所帮助。 - Christopher Rodriguez Conde
1
我还发现了这些stackoverflow帖子,可能会有所帮助:post-1post-2。根据文档,当你运行scrapy crawl时,Scrapy每个进程只能运行一个爬虫。然而,Scrapy支持使用内部API在同一进程中运行多个爬虫。 - Christopher Rodriguez Conde
有人找到解决方案了吗?相关问题:https://dev59.com/BLroa4cB1Zd3GeqPgDum - WJA
1
我最终将我的爬虫包装在自己的进程中。 @ChristopherRodriguezConde的解决方案让我找到了正确的方向。 我在这里写了一篇文章:https://weautomate.org/articles/running-scrapy-spider-cloud-function/ - TKrugg
2个回答

4

0
代码看起来没问题。可能的一个问题是你的设置文件在主文件 main.py 的子目录中。用正确的文件夹路径加载该文件。
    settings_file_path = '<main_folder>.<sub_folder>.settings'  
    os.environ.setdefault('SCRAPY_SETTINGS_MODULE', settings_file_path)
    settings = get_project_settings()
    settings.setdict({
        'LOG_LEVEL': 'ERROR',
        'LOG_ENABLED': True,
    })
    process = CrawlerProcess(settings)
    process.crawl(BlogSpider)
    process.start()
    return 'OK'

这段代码似乎可以在我的谷歌云功能上工作。


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