The*_*ack 3 python amazon-web-services scrapy python-3.x aws-lambda
我使用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
Run Code Online (Sandbox Code Playgroud)
通常,我会获得有关要爬网的页面的全部信息。在开始爬网,安装钩针编织并添加其声明器并安装和使用此特定框架(听起来像它可以解决此问题,但它也无法正常工作)之后,我尝试过睡觉。
我确定这是Lambda不尊重scrapys阻塞的问题,但我不知道如何解决。
我有同样的问题,并通过为此创建空模块来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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |