Python AWS Lambda-刮片库不工作(无法导入名称证书)

Python AWS Lambda-刮片库不工作(无法导入名称证书),python,scrapy,pip,aws-lambda,Python,Scrapy,Pip,Aws Lambda,我想使用AWS Lambda刮网站。 爬虫程序代码是用Python编写的,并使用Pip提供的Scrapy库 要运行lambda函数,我必须在公共Amazon Linux AMI版本(amzn-AMI-hvm-2017.03.1.20170812-x86_64-gp2)中创建一个依赖项压缩包(此处仅为scrapy),根据,添加lambda函数并上传以创建lambda函数 现在,当我调用lambda函数时,会出现以下错误: cannot import name certificate_transpa

我想使用AWS Lambda刮网站。 爬虫程序代码是用Python编写的,并使用Pip提供的Scrapy库

要运行lambda函数,我必须在公共Amazon Linux AMI版本(amzn-AMI-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
无法导入名称证书\u透明度:ImportError
回溯(最近一次呼叫最后一次):
文件“/var/task/my_lambda_function.py”,第120行,在my_lambda_处理程序中
返回get_data_from_scrapy(用户名、密码)
文件“/var/task/my_lambda_function.py”,第104行,从_scrapy获取数据
进程爬网(MyScrapyFunction)
文件“/var/task/scrapy/crawler.py”,第167行,在爬网中
爬虫=自我。创建爬虫(爬虫或蜘蛛)
文件“/var/task/scrapy/crawler.py”,第195行,在create\u crawler中
返回自我。创建爬虫程序(爬虫程序或蜘蛛程序)
文件“/var/task/scrapy/crawler.py”,第200行,在创建爬虫程序中
返回爬虫程序(spidercls、self.settings)
文件“/var/task/scrapy/crawler.py”,第52行,在__
self.extensions=ExtensionManager.from_crawler(self)
文件“/var/task/scrapy/middleware.py”,第58行,在from_crawler中
返回cls.from_设置(crawler.settings,crawler)
文件“/var/task/scrapy/middleware.py”,第34行,在from_设置中
mwcls=加载对象(clspath)
文件“/var/task/scrapy/utils/misc.py”,第44行,在加载对象中
mod=导入模块(模块)
文件“/usr/lib64/python2.7/importlib/_init__.py”,第37行,在导入模块中
__导入(名称)
文件“/var/task/scrapy/extensions/memusage.py”,第16行,在
从scrapy.mail导入邮件发件人
文件“/var/task/scrapy/mail.py”,第22行,在
从twisted.internet导入延迟、反应器、ssl
文件“/var/task/twisted/internet/ssl.py”,第59行,在
从OpenSSL导入SSL
文件“/var/task/OpenSSL/_init__uuu.py”,第8行,在
从OpenSSL导入加密,SSL
文件“/var/task/OpenSSL/crypto.py”,第12行,在
从加密导入x509
文件“/var/task/cryptography/x509/_init__uuu.py”,第7行,在
从cryptography.x509导入证书\u透明度
导入错误:无法导入名称证书\u
以下是我正在使用的依赖项/库版本(均为最新版本):

  • pip 9.0.1
  • 刮痕==1.4.0
  • pyOpenSSL==17.5.0
  • lxml==4.1.1
  • 加密==2.1.4

任何帮助都将不胜感激。提前感谢。

我不会使用AWS Lambda完成如此复杂的任务。你为什么选择它?如果因为它是免费的,您有几个更好的选择:

  • AWS为新客户提供一年免费使用其所有服务的权利
  • AWS Lightsail为您提供一个月的免费最低计划
  • 为您提供免费帐户。我在PythonAnywhere上试过Scrapy,效果很好。请注意,免费帐户的“连续”运行时间最多为2小时,付费帐户的“连续”运行时间最多为6小时(根据他们的支持)
  • 给你一个免费的爬虫。检查名为“将Scrapy Spider部署到ScrapingHub”的视频-该视频可在此课程下免费预览”

我希望这有帮助。如果您有问题,请告诉我。

我不知道您是否最终解决了这个问题,但问题来自lxml库。它需要正确构建C依赖项,这给lambda带来了过多的问题,因为它们依赖于操作系统。我正在通过无服务器AWS部署scrapy,我用了两件事来解决它:无服务器python需求
plugin和
dockerizePip:non-linux
设置。这迫使无服务器在docker容器中构建包,该容器提供正确的二进制文件。注意,除了lxml,这也是让NumPy、SciPy、Pandas等在AWS Lambda上工作的解决方案。以下是我为使其正常运行而遵循的博客:


如果您不想自己制作zip文件,那么无服务器很好。如果您这样做了,这里有一个堆栈溢出链接,显示如何使用lxml解决问题:

正如Ivan提到的,这里的问题来自python包所需的c依赖关系

幸运的是,AWS发布了一个Docker图像,该图像与Lambda函数使用的AMI几乎相同,下面是一个我自己使用的图像,并对其进行了更详细的阐述

这是我的docker配置,我用来构建我的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 *
这就是我如何构建映像并使用卷运行它以在完成后获得部署包zip文件的方法

docker build -t TAG_NAME_HERE .
docker run --rm -v ${PWD}/deployment_package:/packages -t TAG_NAME_HERE

希望这能有所帮助。

我只是想废弃一个网站并将其转储到某个数据库中。我同意你的观点,我不应该用Lambda来刮东西,我现在不使用它。但我只是好奇为什么Lambda在满足AmazonLinuxAMI中编译的所有依赖项之后仍然不工作。