Chi*_*nha 2 python pip scrapy aws-lambda
我想使用 AWS Lambda 来抓取网站。爬虫代码使用 Python 编写并使用 Pip 提供的 Scrapy 库。
要运行 lambda 函数,我必须在公共 Amazon Linux AMI 版本 - amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2 中创建一个依赖项的 zip(这里仅是 scrapy),根据他们的文档here,添加 lambda 函数和上传它以创建 lambda 函数。
现在,当我调用 lambda 函数时,它给了我以下错误:
cannot import name certificate_transparency: ImportError
Traceback (most recent call last):
File "/var/task/my_lambda_function.py", line 120, in my_lambda_handler
return get_data_from_scrapy(username, password)
File "/var/task/my_lambda_function.py", line 104, in get_data_from_scrapy
process.crawl(MyScrapyFunction)
File "/var/task/scrapy/crawler.py", line 167, in crawl
crawler = self.create_crawler(crawler_or_spidercls)
File "/var/task/scrapy/crawler.py", line 195, in create_crawler
return self._create_crawler(crawler_or_spidercls)
File "/var/task/scrapy/crawler.py", line 200, in _create_crawler
return Crawler(spidercls, self.settings)
File "/var/task/scrapy/crawler.py", line 52, in __init__
self.extensions = ExtensionManager.from_crawler(self)
File "/var/task/scrapy/middleware.py", line 58, in from_crawler
return cls.from_settings(crawler.settings, crawler)
File "/var/task/scrapy/middleware.py", line 34, in from_settings
mwcls = load_object(clspath)
File "/var/task/scrapy/utils/misc.py", line 44, in load_object
mod = import_module(module)
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
File "/var/task/scrapy/extensions/memusage.py", line 16, in <module>
from scrapy.mail import MailSender
File "/var/task/scrapy/mail.py", line 22, in <module>
from twisted.internet import defer, reactor, ssl
File "/var/task/twisted/internet/ssl.py", line 59, in <module>
from OpenSSL import SSL
File "/var/task/OpenSSL/__init__.py", line 8, in <module>
from OpenSSL import crypto, SSL
File "/var/task/OpenSSL/crypto.py", line 12, in <module>
from cryptography import x509
File "/var/task/cryptography/x509/__init__.py", line 7, in <module>
from cryptography.x509 import certificate_transparency
ImportError: cannot import name certificate_transparency
Run Code Online (Sandbox Code Playgroud)
以下是我正在使用的依赖项/库版本(都是最新的):
任何帮助,将不胜感激。提前致谢。
我不会使用 AWS Lambda 来完成如此复杂的任务。你为什么选择它?如果因为它是免费的,您有几个更好的选择:
我希望这有帮助。如果您有疑问,请告诉我。
我不知道您是否最终解决了这个问题,但问题出在 lxml 库中。它需要 C 依赖才能正确构建,这给 lambda 带来了很多问题,因为它们依赖于操作系统。我正在通过无服务器 AWS 部署scrapy,我使用了两件事来解决它:serverless-python-requirements
插件和dockerizePip: non-linux
设置。这会强制无服务器在 docker 容器中构建包,该容器提供正确的二进制文件。请注意,除了 lxml 之外,这也是让 NumPy、SciPy、Pandas 等在 AWS Lambda 上工作的解决方案。这是我关注的博客以使其正常工作:https : //serverless.com/blog/serverless-python-packaging/
如果您不想自己制作 zip 文件,那么无服务器非常好。如果你这样做了,这里有一个堆栈溢出链接,显示了如何使用 lxml 解决问题:AWS Lambda not importing LXML