Docker:使用带有无头 Selenium Chromedriver 的容器
Docker: using container with headless Selenium Chromedriver
我正在尝试 link peroumal1's "docker-chrome-selenium" container 到另一个使用 Selenium 的抓取代码的容器。
他将他的容器公开到端口 4444(Selenium 的默认端口),但我无法从我的 scraper 容器访问它。这是我的 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
这是我的抓取工具Docker文件:
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' 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
binary 并将其添加到路径来修复此问题,但我不知道是什么在这里做。
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://google.com')
driver.close()
编辑: 我也在尝试使用 Selenium's official images 进行此操作,不幸的是,它也不起作用(出现要求 chromedriver 二进制文件的相同错误消息).
Python 代码需要做些什么吗?
谢谢!
更新: 正如@peroumal1 所说,问题是我没有连接到 remote driver using Selenium。然而,在我这样做之后,我遇到了连接问题(urllib2.URLError: <urlopen error [Errno 111] Connection refused>
),直到我修改了 Selenium 驱动程序连接到的 IP 地址(当使用 boot2docker
时,你必须连接到虚拟机的 IP 而不是你的计算机的本地主机,您可以通过键入 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,而是代码。
Selenium 图像通过远程 Webdriver 提供到 Selenium 服务器的接口,并且提供的代码尝试使用 chromedriver 直接实例化 Chrome 浏览器,Selenium Python 绑定可以实现这一点,前提是 chromedriver 是可从环境访问。
也许使用 docs 中的示例会更好:
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)
我正在尝试 link peroumal1's "docker-chrome-selenium" container 到另一个使用 Selenium 的抓取代码的容器。
他将他的容器公开到端口 4444(Selenium 的默认端口),但我无法从我的 scraper 容器访问它。这是我的 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
这是我的抓取工具Docker文件:
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' 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
binary 并将其添加到路径来修复此问题,但我不知道是什么在这里做。
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://google.com')
driver.close()
编辑: 我也在尝试使用 Selenium's official images 进行此操作,不幸的是,它也不起作用(出现要求 chromedriver 二进制文件的相同错误消息).
Python 代码需要做些什么吗?
谢谢!
更新: 正如@peroumal1 所说,问题是我没有连接到 remote driver using Selenium。然而,在我这样做之后,我遇到了连接问题(urllib2.URLError: <urlopen error [Errno 111] Connection refused>
),直到我修改了 Selenium 驱动程序连接到的 IP 地址(当使用 boot2docker
时,你必须连接到虚拟机的 IP 而不是你的计算机的本地主机,您可以通过键入 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,而是代码。 Selenium 图像通过远程 Webdriver 提供到 Selenium 服务器的接口,并且提供的代码尝试使用 chromedriver 直接实例化 Chrome 浏览器,Selenium Python 绑定可以实现这一点,前提是 chromedriver 是可从环境访问。
也许使用 docs 中的示例会更好:
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)