哪些 ChromeDriver & Headless Chrome 版本与 ruby 2.7 兼容?

Which ChromeDriver & Headless Chrome versions exist that are compatible with ruby 2.7?

问题

我在 AWS lambda 中有一个网络抓取工具 运行,但 几周后 AWS lambda 将停止支持 Ruby 2.7。我去年使用 this tutorial.

构建了我的爬虫

我需要找到与 Ruby 2.7 兼容的 chrome driver & headless chrome 版本,但我没有不知道从哪里开始。

我看过 ChromeDriver's downloads portal 但我没有看到任何迹象表明 Chrome 驱动程序适用于 ruby 2.7 或 [=38= 的任何其他特定版本] 就此而言。

我的代码通过访问 Chrome 驱动程序二进制文件并在特定文件夹中启动它来工作

我通过 运行 这些命令下载了我正在使用的特定二进制文件:

# serverless chrome
wget https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip
unzip stable-headless-chromium-amazonlinux-2017-03.zip -d bin/
rm stable-headless-chromium-amazonlinux-2017-03.zip

# chromedriver
wget https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip
unzip chromedriver_linux64.zip -d bin/
rm chromedriver_linux64.zip

解决方案

我找到了解决这个问题的方法。 Ruby Lambda 默认提供的 2.7 在 Amazon Linux 2 之上运行(缺少许多重要的库和依赖项),不幸的是,您无能为力。

然而,Amazon offers you the ability to run your code in a custom docker image that can be up to 10GB in size.

我通过使用以下 Dockerfile 创建自己的映像解决了这个问题

FROM public.ecr.aws/lambda/ruby:2.7

# Install dependencies needed to run MySQL & Chrome

RUN yum -y install libX11
RUN yum -y install dejavu-sans-fonts
RUN yum -y install procps
RUN yum -y install mysql-devel
RUN yum -y install tree
RUN mkdir /var/task/lib
RUN cp /usr/lib64/mysql/libmysqlclient.so.18 /var/task/lib
RUN gem install bundler
RUN yum -y install wget
RUN yum -y groupinstall 'Development Tools'

# Ruby Gems

ADD Gemfile ${LAMBDA_TASK_ROOT}/
ADD Gemfile.lock ${LAMBDA_TASK_ROOT}/
RUN bundle config set path 'vendor/bundle' && \
    bundle install

# Install chromedriver & chromium

RUN mkdir ${LAMBDA_TASK_ROOT}/bin

# Chromium
RUN wget https://github.com/adieuadieu/serverless-chrome/releases/download/v1.0.0-37/stable-headless-chromium-amazonlinux-2017-03.zip
RUN unzip stable-headless-chromium-amazonlinux-2017-03.zip -d ${LAMBDA_TASK_ROOT}/bin/
RUN rm stable-headless-chromium-amazonlinux-2017-03.zip

# Chromedriver

RUN wget https://chromedriver.storage.googleapis.com/2.37/chromedriver_linux64.zip
RUN unzip chromedriver_linux64.zip -d ${LAMBDA_TASK_ROOT}/bin/
RUN rm chromedriver_linux64.zip

# Copy function code

COPY app.rb ${LAMBDA_TASK_ROOT}

WORKDIR ${LAMBDA_TASK_ROOT}

RUN tree
RUN ls ${LAMBDA_TASK_ROOT}/bin
# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handle" ]

备注

  1. 如果您的代码之前是使用 zip 文件部署的,您将不得不销毁之前的函数或使用代码更新创建第二个函数,这一切都取决于您希望如何处理部署。
  2. 可以使用 serverless framework
  3. 自动执行部署过程