我有一个硒解析器,需要在docker中运行。当在本地机器上运行时,脚本完全正常工作。当在容器中运行时,感觉硒不起作用,当搜索任何元素时,我会得到一个错误,即找不到元素。因此,我得出结论,selenium不在docker中运行,或者它不能与chrome浏览器集成。我试着在容器中安装chrome浏览器和chrome驱动程序。尝试使用在另一个容器中运行的远程驱动程序。结果总是一样的。最高优先级是在不使用远程驱动程序的情况下运行。期待您的建议,谢谢大家!
我的Dockerfile:
FROM python:3.10-slim-buster
RUN mkdir -p /usr/src/app/
WORKDIR /usr/src/app/
COPY . /usr/src/app/
RUN pip install --no-cache-dir -r requirements.txt
RUN apt-get update
&& apt-get install -y wget
&& apt-get install -y gnupg2
&& apt-get install -y curl
&& rm -rf /var/lib/apt/lists/*
# install google chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable
# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/src/app/chromedriver/
CMD python3 ./script.py
我的Python脚本:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
service = Service(r'chromedriver/chromedriver')
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
# webdriver mode
options.add_argument('--disable-blink-features=AutomationControlled')
# user-agent
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/103.0.0.0 Safari/537.36")
options.add_argument('--window-size=1420,1080')
# headless mode
options.add_argument('--headless')
options.add_argument('--disable-gpu')
# incognito mode
options.add_argument("--incognito")
options.add_experimental_option("excludeSwitches", ["enable-logging"])
driver = webdriver.Chrome(
service=service,
options=options
)
不知道Selenium的用例和实际错误,但基于Dockerfile和Python脚本,我尝试运行Selenium Getting Started示例。
我刚刚在你的脚本中添加了这两行:
driver.get("http://www.python.org")
print("Python" in driver.title)
在第一次运行中,我遇到了这个错误:
Traceback (most recent call last):
File "/usr/src/app/script.py", line 29, in <module>
driver.get("http://www.python.org")
File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 447, in get
self.execute(Command.GET, {'url': url})
File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/remote/webdriver.py", line 435, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.10/site-packages/selenium/webdriver/remote/errorhandler.py", line 247, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: session deleted because of page crash
from tab crashed
(Session info: headless chrome=103.0.5060.134)
Stacktrace:
因此,基于这个答案,我通过声明以下参数来解决问题:options.add_argument("--disable-dev-shm-usage")
然后剧本如预期的那样发挥了作用。
Docker run --shm-size=1gb image_name
或
在main.py
文件或您的文件中的色度选项中,您可以禁用shm-usage
谷歌搜索。
基本上,当硒和铬一起运行时,由于shm的体积小,它失败了。