【问题标题】:AWS Lambda - scrapy library is not working (cannot import name certificate_transparency)AWS Lambda - scrapy 库不工作(无法导入名称 certificate_transparency)
【发布时间】:2018-06-08 19:36:33
【问题描述】:

我想使用 AWS Lambda 来抓取网站。 爬虫代码使用 Python 编写,并使用 Pip 提供的 Scrapy 库。

要运行 lambda 函数,我必须根据 their documentation here 在公共 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

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

  • 点 9.0.1
  • Scrapy==1.4.0
  • pyOpenSSL==17.5.0
  • lxml==4.1.1
  • 密码学==2.1.4

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

【问题讨论】:

    标签: python scrapy pip aws-lambda


    【解决方案1】:

    我不知道您是否最终解决了这个问题,但问题来自 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

    【讨论】:

      【解决方案2】:

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

      • AWS 为新帐户提供一年免费访问其所有服务的机会。
      • AWS Lightsail 为您提供一个月的免费最低套餐。
      • PythonAnywhere.com 为您提供免费帐户。我在 PythonAnywhere 上尝试了 Scrapy,它运行良好。请注意,免费帐户的“连续”运行时间最长为 2 小时,付费帐户最长为 6 小时(根据他们的支持)。
      • ScrapingHub.com 给你一个免费的爬虫。查看名为“将 Scrapy Spider 部署到 ScrapingHub”的视频 - 该视频可在本课程“Scrapy: Powerful Web Scraping & Crawling with Python”下免费预览。

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

      【讨论】:

      • 我只是想废弃一个网站并将其转储到某个数据库中。我同意你的观点,我不应该使用 Lambda 进行抓取,而且我现在不使用它。但是我很好奇为什么 Lambda 在满足了 Amazon Linux AMI 中编译的所有依赖项之后仍然无法工作。
      【解决方案3】:

      正如 Ivan 提到的,这里的问题源于 python 包所需的 c 依赖项

      幸运的是,AWS 发布了一个amazonlinux Docker 镜像,它与 Lambda 函数使用的 AMI 几乎相同,这是我自己使用的一个 article,并对其进行了更详细的说明。

      这是我用来构建我的 Scrapy 项目并将其打包为 lambda 的 docker 配置

      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
      

      希望这能有所帮助。

      【讨论】:

        猜你喜欢
        • 2018-01-01
        • 2019-03-11
        • 2019-12-03
        • 2020-03-30
        • 2019-12-11
        • 2018-03-22
        • 2016-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多