AWS Lambda - scrapy 库不工作(无法导入名称certificate_transparency)

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)

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

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

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

GoT*_*ned 5

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

  • AWS 为新账户提供一年免费访问其所有服务的权限。
  • AWS Lightsail 为您提供一个月的免费最低套餐。
  • PythonAnywhere.com为您提供一个免费帐户。我在 PythonAnywhere 上尝试了 Scrapy,它运行得很好。请注意,免费帐户的“连续”运行时间最多为 2 小时,付费帐户的“连续”运行时间为 6 小时(根据其支持)。
  • ScrapingHub.com为您提供一个免费的爬虫。查看名为“将 Scrapy Spider 部署到 ScrapingHub ”的视频- 该视频可在本课程“ Scrapy:使用 Python 进行强大的网页抓取和爬行”下免费预览。

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


Iva*_*eng 5

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