Docker:如何使用无头Selenium Chromedriver容器

5
我正在尝试将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

这是我的爬虫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/

当我尝试从我的代码中使用Selenium时(见下文),我却收到以下错误信息:selenium.common.exceptions.WebDriverException: Message: 'chromedriver'可执行文件需要在路径中可用。请查看http://docs.seleniumhq.org/download/#thirdPartyDrivers并在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()

编辑:我也尝试使用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

以下是与编程有关的 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()

请使用 docker exec -it container_id env 命令检查您的路径,它会显示什么? - user2915097
1个回答

8
我认为问题可能不在于Docker,而是代码。Selenium镜像通过远程Webdriver提供与Selenium服务器的接口,所提供的代码尝试直接使用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)

4
你也可以直接使用 http://my-selenium-container-name:4444/wd/hub 而不是输入 IP 地址。 - lukeaus
1
或者更好的方法是使用PyPI中的“docker”软件包来获取“HostIp”和“HostPort”。 - streof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接