【问题标题】:AWS Lambda Python 3.7 Web Scraping - "Could not get version for Chrome with this command: google-chrome --version"AWS Lambda Python 3.7 Web Scraping - “无法使用此命令获取 Chrome 的版本:google-chrome --version”
【发布时间】:2020-01-21 02:07:38
【问题描述】:

通过 S3 存储桶,我将 lambda 函数及其依赖项作为 ZIP 文件上传。 lambda 函数是一个网络爬虫,使用以下初始代码启动爬虫:

import json
import os
import pymysql
import boto3
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.support import expected_conditions as EC

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--window-size=1280x1696')
chrome_options.add_argument('--user-data-dir=/tmp/user-data')
chrome_options.add_argument('--hide-scrollbars')
chrome_options.add_argument('--enable-logging')
chrome_options.add_argument('--log-level=0')
chrome_options.add_argument('--v=99')
chrome_options.add_argument('--single-process')
chrome_options.add_argument('--data-path=/tmp/data-path')
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_argument('--homedir=/tmp')
chrome_options.add_argument('--disk-cache-dir=/tmp/cache-dir')
chrome_options.binary_location = os.getcwd() + "/bin/headless-chromium"
browser = webdriver.Chrome(executable_path=ChromeDriverManager().install(), options=chrome_options)

当我尝试测试 lambda 函数时,我在控制台中收到以下错误:

{
  "errorMessage": "Could not get version for Chrome with this command: google-chrome --version",
  "errorType": "ValueError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 67, in lambda_handler\n    browser = webdriver.Chrome(executable_path=ChromeDriverManager().install(), options=chrome_options)\n",
    "  File \"/var/task/webdriver_manager/chrome.py\", line 24, in install\n    driver_path = self.download_driver(self.driver)\n",
    "  File \"/var/task/webdriver_manager/manager.py\", line 32, in download_driver\n    driver_version, is_latest = self.__get_version_to_download(driver)\n",
    "  File \"/var/task/webdriver_manager/manager.py\", line 23, in __get_version_to_download\n    return self.__get_latest_driver_version(driver), True\n",
    "  File \"/var/task/webdriver_manager/manager.py\", line 17, in __get_latest_driver_version\n    return driver.get_latest_release_version()\n",
    "  File \"/var/task/webdriver_manager/driver.py\", line 54, in get_latest_release_version\n    self._latest_release_url + '_' + chrome_version())\n",
    "  File \"/var/task/webdriver_manager/utils.py\", line 98, in chrome_version\n    .format(cmd)\n"
  ]
}

作为回应,我尝试编辑 webdriver_manager 依赖文件夹中的 utils.py 文件,方法是使用“chrome --version”和“chromium-browser --version”等其他命令而不是“google-chrome --version”在 'chrome_version()' 的函数定义下,但出现了无法从新命令获取 chrome 版本的类似错误:

def chrome_version():
    pattern = r'\d+\.\d+\.\d+'
    cmd_mapping = {
        OSType.LINUX: 'google-chrome --version',
        OSType.MAC: r'/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version',
        OSType.WIN: r'reg query "HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon" /v version'
    }

    cmd = cmd_mapping[os_name()]
    stdout = os.popen(cmd).read()
    version = re.search(pattern, stdout)
    if not version:
        raise ValueError(
            'Could not get version for Chrome with this command: {}'
            .format(cmd)
        )
    return version.group(0)

谁能告诉我应该使用什么命令来代替“google-chrome --version”?

【问题讨论】:

  • 我不相信你会让它像那样工作。你需要包含一个 linux chromium 二进制文件或者可能是 phantomjs
  • @pguardiario 下载后,如何将它包含在 webdriver 管理器的 utils.py 中?
  • 这是a repo,您可以复制它,它包含一个 linux phantomjs 二进制文件,您可以看到我在脚本中是如何使用它的。
  • 我尝试使用 phantomjs 二进制文件,但收到了同样的错误。我决定从 webdriver_manager.chrome 包中避免使用 Chrome 驱动程序管理器并切换到 selenium.webdriver 库和包。我仍然不确定 Chrome 驱动程序管理器库是如何工作的,但至少现在我知道我还有另一个选择。

标签: python-3.x web-scraping aws-lambda selenium-chromedriver


【解决方案1】:

默认情况下,运行我们的 lambda 函数的容器上不存在 Google Chrome。

我正在实施类似的解决方案,但使用的是 JavaScript,我解决的方法是使用微型浏览器 (Chromium),并使用以下软件包:

    "chrome-aws-lambda": "^1.19.0",
    "puppeteer-core": "^1.19.0"

对于 Python,这里有一个教程可能会对您的情况有所帮助。

https://robertorocha.info/setting-up-a-selenium-web-scraper-on-aws-lambda-with-python/

【讨论】:

  • 我尝试使用“chrome-aws-lambda --version”,但也没有用。
  • 嗨,这些是 nodejs 库。也许尝试 NodeJS 对这项任务来说并没有那么糟糕。
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2020-01-22
  • 2017-07-27
  • 2021-11-17
相关资源
最近更新 更多