我有一个
flask
应用程序,可以在 selenium
路线上触发 /scrape
脚本,我已在 render.com 上部署了该应用程序,该应用程序运行良好,可以对其进行测试我已在 custom_hello()
上定义了
/
路线,通过它我可以确认烧瓶工作正常。 当我尝试重定向触发脚本的
/scrape
时,由于多种原因而失败 -
Chromedriver
路径和google-chrome binary
路径FileNotFoundError: No such file or directory: 'google-chrome'
selenium.common.exceptions.WebDriverException: Message: unknown error: cannot find Chrome binary
我在网上查找了解决 python 脚本本身中的 chromedriver 问题,并找到了几个 python 库 -
chrome-driver-binary
get-chrome-driver
chromedriver
我阅读了
pypy
上的说明并尝试了这些,但问题是相同的。
我尝试将 chrome 浏览器本身下载到服务器中,因此在构建设置中使用
wget
以便安装 chrome 浏览器,但它不允许我使用 sudo
命令来构建已安装的浏览器(如果您知道我的意思)
任何人都可以看到代码 -
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import json
import os
# Set up ChromeDriver path
chrome_driver_path = '/path/to/chromedriver'
# Set Chrome options
chrome_options = Options()
chrome_options.add_argument('--headless') # Run ChromeDriver in headless mode
# Create a new ChromeDriver instance
service = Service(chrome_driver_path)
driver = webdriver.Chrome(service=service, options=chrome_options)
对于任何建议
chrome_driver_path
的人,是的,当我使用get-chromedriver
和get-chrome-binary
时,我也尝试修改它
代码并不总是这样,每次我在调试它并尝试部署它时推送一些更改,如果你想查看所有提交,你可以检查它们这里
我只是需要部署此类应用程序的人的帮助,您在其中发出请求并触发
selenium
脚本,我知道托管平台不提供对 chrome
或 chromedriver
的支持,我很好奇如何部署此应用程序并使其正常工作。
这是一个对我有用的解决方案,并且应该适用于遇到此麻烦的任何人,前提是您有一个适用于本地环境但不适用于云或托管的 API 或简单的 selenium 脚本。
请阅读最后的
docker run
命令部分的完整答案,您需要使用该命令才能成功运行您的脚本/应用程序。
您需要将以下代码添加到
Dockerfile
并必须使用该 Dockerfile
托管它,相信我,这是最简单、最简单的方法,如果您正在考虑尝试 selenium/standalone-chrome
图像,那么祝您好运相应地配置你的脚本。
相反,只需配置 Dockerfile
一点点,就可以开始了...
# FROM ubuntu:bionic
FROM python:3.10
RUN apt-get update && apt-get install -y \
# python3 python3-pip \
fonts-liberation libappindicator3-1 libasound2 libatk-bridge2.0-0 \
libnspr4 libnss3 lsb-release xdg-utils libxss1 libdbus-glib-1-2 \
curl unzip wget vim \
xvfb libgbm1 libu2f-udev libvulkan1
RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
wget https://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \
unzip chromedriver_linux64.zip -d /usr/bin && \
chmod +x /usr/bin/chromedriver && \
rm chromedriver_linux64.zip
RUN CHROME_SETUP=google-chrome.deb && \
wget -O $CHROME_SETUP "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb" && \
dpkg -i $CHROME_SETUP && \
# apt install $CHROME_SETUP && \
apt-get install -y -f && \
rm $CHROME_SETUP
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
ENV PYTHONUNBUFFERED=1
ENV PATH="$PATH:/bin:/usr/bin"
# RUN pip3 install pyvirtualdisplay
# RUN pip3 install Selenium-Screenshot
WORKDIR /app
# COPY requirements.txt /app
COPY . /app
RUN --mount=type=cache,target=/root/.cache/pip \
pip3 install -r requirements.txt
# ENTRYPOINT ["python3"]
CMD ["python3", "app.py"]
# ENV APP_HOME /usr/src/app
# WORKDIR /$APP_HOME
# COPY . $APP_HOME/
# CMD tail -f /dev/null
# CMD python3 app.py
现在,我正在拉取
python
图像,然后安装构建 chrome 浏览器所需的所有软件包,然后安装和设置 chrome 浏览器和 chromedriver
。
在
Dockerfile
中更改 CMD
命令以运行脚本或应用程序名称。
在python脚本中将chromdriver
的路径更改为/path/to/chromedriver
,它将自动检测chromediver
。
如果您的构建失败,很可能是因为在安装和设置 google-chrome 之前您可能需要安装一些额外的软件包
Dockerfile
,在提示中它会提到您 google-chrome depends on ~@@###
一些您需要查看的软件包在线获取该软件包,如何在 ubuntu 上安装该软件包并将安装名称添加到 Dockerfile
RUN
命令,如下 -
RUN CHROMEDRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
wget https://chromedriver.storage.googleapis.com/$CHROMEDRIVER_VERSION/chromedriver_linux64.zip && \
unzip chromedriver_linux64.zip -d /usr/bin && \
chmod +x /usr/bin/chromedriver && \
rm chromedriver_linux64.zip && \
{package(s) name}
我已经在最后加上名字了。
当您使用 google-chrome 时,您需要修改您的
docker run
命令,它应该是这样的 -
docker run -p portnumber:portnumber --shm-size="2g" name_of_image
使用 dockerfile 对您有用吗?