首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS scrapy库无法工作(不能导入名称certificate_transparency)

AWS scrapy库无法工作(不能导入名称certificate_transparency)
EN

Stack Overflow用户
提问于 2017-12-28 08:49:29
回答 3查看 1.9K关注 0票数 2

我想使用AWS Lambda刮一个网站。爬虫代码在Python中,并使用Pip提供的Scrapy库。

要运行lambda函数,我必须在公共Amazon版本-amzn hvm-2017.03.1.20170812-x86_64-GP2中创建依赖关系的压缩(此处仅为scrapy),按照他们的文件在这里,添加lambda函数并上传它以创建lambda函数。

现在,当我调用lambda函数时,它会给出以下错误:

代码语言:javascript
复制
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

下面是我使用的依赖项/库版本(都是最新版本):

  • pip 9.0.1
  • Scrapy==1.4.0
  • pyOpenSSL==17.5.0
  • lxml==4.1.1
  • cryptography==2.1.4

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

EN

回答 3

Stack Overflow用户

发布于 2017-12-28 14:33:25

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

我希望这能帮到你。如果你有问题,请告诉我。

票数 5
EN

Stack Overflow用户

发布于 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的问题

票数 5
EN

Stack Overflow用户

发布于 2018-12-17 09:37:50

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

幸运的是,AWS发布了一个阿马 Docker映像,它与Lambda函数使用的AMI几乎相同,下面是我自己使用的文章,并详细阐述了这一点。

下面是我用来构建Scrapy项目并为lambda打包的对接器配置

代码语言:javascript
复制
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文件

代码语言:javascript
复制
#!/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 *

这就是我如何构建映像并使用卷运行它,以便在完成部署包压缩文件之后获得它。

代码语言:javascript
复制
docker build -t TAG_NAME_HERE .
docker run --rm -v ${PWD}/deployment_package:/packages -t TAG_NAME_HERE

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48004350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档