无法从AWS lamb上的Scrapy获取结果

2024-05-15 16:14:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python scrapy库构建了一个爬虫程序。它在本地运行时工作完美可靠。我试图将它移植到AWS lambda(我已经对它进行了适当的打包)。然而,当我运行它时,进程并没有被阻止,而在爬网程序返回没有结果之前完成。在日志退出之前,我从日志中得到的最后几行:

2018-09-12 18:58:07 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2018-09-12 18:58:07 [scrapy.core.engine] INFO: Spider opened

而通常我会得到关于被爬网页面的全部信息。我尝试过在启动爬网之后睡觉,安装钩针并添加其声明器,安装并使用this特定框架,听起来似乎解决了这个问题,但它也不起作用。在

我确定这是兰姆达不尊重废料阻塞的问题,但我不知道如何解决它。在


Tags: lambdacore程序infoaws进程enableditem
1条回答
网友
1楼 · 发布于 2024-05-15 16:14:05

我遇到了同样的问题,并通过为sqlite3创建空模块来解决它,如下面的答案所述:https://stackoverflow.com/a/44532317/5441099。表面上,Scrapy导入sqlite3,但并不一定使用它。Python3希望sqlite3位于主机上,但是AWS Lambda机器没有。错误消息并不总是显示在日志中。在

这意味着您可以通过切换到Python2或像我一样为sqlite3创建空模块来使其工作。在

我运行爬虫程序的入口文件如下所示,它在使用Python3.6的Lambda上运行:

# run_crawler.py
# crawl() is invoked from the handler function in Lambda
import os
from my_scraper.spiders.my_spider import MySpider
from scrapy.crawler import CrawlerProcess
# Start sqlite3 fix
import imp
import sys
sys.modules["sqlite"] = imp.new_module("sqlite")
sys.modules["sqlite3.dbapi2"] = imp.new_module("sqlite.dbapi2")
# End sqlite3 fix


def crawl():
    process = CrawlerProcess(dict(
        FEED_FORMAT='json',
        FEED_URI='s3://my-bucket/my_scraper_feed/' +
        '%(name)s-%(time)s.json',
        AWS_ACCESS_KEY_ID=os.getenv('AWS_ACCESS_KEY_ID'),
        AWS_SECRET_ACCESS_KEY=os.getenv('AWS_SECRET_ACCESS_KEY'),
    ))
    process.crawl(MySpider)
    process.start()  # the script will block here until all crawling jobs are finished


if __name__ == '__main__':
    crawl()

相关问题 更多 >