我想使用AWS Lambda刮一个网站。爬虫代码在Python中,并使用Pip提供的Scrapy库。
要运行lambda函数,我必须在公共Amazon版本-amzn hvm-2017.03.1.20170812-x86_64-GP2中创建依赖关系的压缩(此处仅为scrapy),按照他们的文件在这里,添加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下面是我使用的依赖项/库版本(都是最新版本):
任何帮助都将不胜感激。提前谢谢。
发布于 2017-12-28 14:33:25
我不会将AWS Lambda用于如此复杂的任务。你为什么选择它?如果因为它是免费的,那么您有几个更好的选择:
我希望这能帮到你。如果你有问题,请告诉我。
发布于 2018-10-24 09:15:29
我不知道您是否最终解决了这个问题,但问题来自于lxml库。它需要C依赖关系才能正确构建,这给lambda带来了大量问题,因为它们依赖于操作系统。我正在通过无服务器的AWS部署scrapy,我使用了两种方法来解决这个问题:serverless-python-requirements插件和dockerizePip: non-linux设置。这迫使无服务器者在一个码头容器中构建包,它提供了正确的二进制文件。注意,除了lxml之外,这也是获得NumPy、SciPy、Pandas等在AWS上工作的解决方案。下面是我为了让它运行而跟踪的一个博客:https://serverless.com/blog/serverless-python-packaging/
如果您不想自己处理zip文件,Serverless很好。如果是这样的话,下面是一个堆栈溢出链接,它展示了如何解决lxml:未导入LXML的AWS Lambda的问题
发布于 2018-12-17 09:37:50
正如Ivan提到的,这里的问题来自于python包所需的c++依赖关系。
幸运的是,AWS发布了一个阿马 Docker映像,它与Lambda函数使用的AMI几乎相同,下面是我自己使用的文章,并详细阐述了这一点。
下面是我用来构建Scrapy项目并为lambda打包的对接器配置
FROM amazonlinux:latest
RUN yum -y install git \
gcc \
openssl-devel \
bzip2-devel \
libffi \
libffi-devel \
python3-devel \
python37 \
zip \
unzip \
&& yum clean all
RUN python3 -m pip install --upgrade pip
COPY src /io
CMD sh /io/package.sh这是package.sh文件
#!/bin/bash
mkdir holder
python3 -m pip install scrapy OTHER-REPOS -t holder
rm -f /packages/lambda.zip
cp -r /io/* holder
cd holder
zip -r /packages/lambda.zip *这就是我如何构建映像并使用卷运行它,以便在完成部署包压缩文件之后获得它。
docker build -t TAG_NAME_HERE .
docker run --rm -v ${PWD}/deployment_package:/packages -t TAG_NAME_HERE希望这能帮上忙。
https://stackoverflow.com/questions/48004350
复制相似问题