Docker:使用带无头Selenium Chromedriver的容器

ara*_*lar 5 python selenium selenium-chromedriver docker docker-compose

我正在尝试将peroumal1的"docker-chrome-selenium"容器与使用Selenium的抓取代码链接到另一个容器.

他将他的容器暴露在4444端口(Selenium的默认容器),但是我无法从我的刮刀容器中访问它.这是我的docker-compose档案:

chromedriver:
  image: eperoumalnaik/docker-chrome-selenium:latest

scraper:
  build: .
  command: python manage.py scrapy crawl general_course_content
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - chromedriver
Run Code Online (Sandbox Code Playgroud)

这是我的刮刀Dockerfile:

FROM python:2.7

RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/

RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /code/
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试从我的代码中使用Selenium时(见下文),我收到以下错误消息:selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be available in the path. Please look at http://docs.seleniumhq.org/download/#thirdPartyDrivers and read up at http://code.google.com/p/selenium/wiki/ChromeDriver.在Mac OS X上,当我没有使用Docker时,我通过下载chromedriver二进制文件并将其添加到路径来修复此问题,但我不知道该怎么做.

driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://google.com')
driver.close()
Run Code Online (Sandbox Code Playgroud)

编辑:我也试图用Selenium的官方图片来做这件事,不幸的是,它也没有用(要求chromedriver二进制文件出现相同的错误信息).

有没有什么需要在Python代码上完成?

谢谢!

更新:正如@ peroumal1所说,问题是我没有使用Selenium连接到远程驱动程序.然而,在我这样做之后,我遇到了连接问题(urllib2.URLError: <urlopen error [Errno 111] Connection refused>),直到我修改了Selenium驱动程序所连接的IP地址(使用时boot2docker,你必须连接到虚拟机的IP而不是计算机的localhost,你可以通过输入找到boot2docker ip)并更改了docker-compose文件.这就是我最终得到的结果:

chromedriver:
  image: selenium/standalone-chrome
  ports:
    - "4444:4444"

scraper:
  build: .
  command: python manage.py scrapy crawl general_course_content
  volumes:
    - .:/code
  ports:
    - 8000:8000
  links:
    - chromedriver
Run Code Online (Sandbox Code Playgroud)

而Python代码(boot2docker我的电脑上的IP地址是192.168.59.103):

driver = webdriver.Remote(
           command_executor='http://192.168.59.103:4444/wd/hub',
           desired_capabilities=DesiredCapabilities.CHROME)
driver.maximize_window()
driver.get('http://google.com')
driver.close()
Run Code Online (Sandbox Code Playgroud)

小智 8

我认为这里的问题可能不是Docker,而是代码.Selenium图像通过远程Webdriver为Selenium Server提供了一个接口,并且提供的代码尝试使用chromedriver直接实例化Chrome浏览器,这是Selenium Python绑定可以实现的,前提是可以从环境访问chromedriver.

也许使用文档中的示例可以更好地工作:

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

driver = webdriver.Remote(
command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities=DesiredCapabilities.CHROME)
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用`http:// my-selenium-container-name:4444/wd/hub`而不是输入IP地址 (3认同)