Невозможно получить результаты от Scrapy на AWS Lambda - PullRequest
0 голосов
/ 12 сентября 2018

Я создал сканер, используя библиотеку python scrapy. Он работает отлично и надежно при работе локально. Я попытался перенести его на лямбду AWS (я его правильно упаковал). Однако, когда я запускаю его, процесс не блокируется, пока выполняется сканирование, а вместо этого завершается, прежде чем сканеры могут вернуться, не давая результатов. Вот последние строки, которые я получаю из журналов перед выходом:

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

В то время как обычно я получаю всю информацию о просматриваемых страницах. Я пробовал спать после запуска сканирования, установки крючка и добавления его деклараторов, установки и использования этой конкретной платформы, которая, похоже, решает эту проблему, но также не работает.

Я уверен, что это проблема с Lambda, которая не учитывает блокировку соскобов, но я понятия не имею, как ее решить.

1 Ответ

0 голосов
/ 19 ноября 2018

У меня была та же проблема, и я исправил ее, создав пустые модули для sqlite3, как описано в этом ответе: https://stackoverflow.com/a/44532317/5441099. Очевидно, Scrapy импортирует sqlite3, но не обязательно использует ее.Python3 ожидает, что sqlite3 будет на хост-компьютере, но на машинах AWS Lambda его нет.Сообщение об ошибке не всегда отображается в журналах.

Это означает, что вы можете заставить его работать, переключившись на Python2 или создав пустые модули для sqlite3, как я.

MyВходной файл для запуска сканера выглядит следующим образом, и он работает на Lambda с Python3.6:

# 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...