Selenium webdriver.Remote驱动程序不适用于Tor代理(webdriver.Chrome可以)

时间:2019-12-03 15:04:48

标签: python selenium docker selenium-chromedriver tor

我正在尝试在remote driver which is hosted as a docker container on port 4444上使用socks5代理。

这是代码示例:

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--no-sandbox")
opts.add_argument("--disable-dev-shm-usage")
opts.add_argument("--proxy-server=socks5://127.0.0.1:9050")
driver = webdriver.Remote(command_executor="http://localhost:4444/wd/hub", desired_capabilities=opts.to_capabilities())

然后,当我尝试打开任何页面时,出现错误,提示Check your proxy settings or contact your network administrator

虽然在常规代理上使用相同的代码示例–效果很好。 当我通过9050端口进行粗体请求时-可以正常工作。

最后,当我将相同的代码示例与webdriver.Chrome而不是webdriver.Remote一起使用时,效果很好!

我希望通过远程Webdriver使一切正常的任何建议。

更新: 我正在使用selenium==3.14.0,并且RemoteDriver正在获取docker映像selenium/node-chrome-debug:3.141.59-radium

1 个答案:

答案 0 :(得分:2)

对于macOS和Windows,您可以使用host.docker.internal从容器访问本地主机:

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--no-sandbox")
opts.add_argument("--disable-dev-shm-usage")
opts.add_argument("--proxy-server=socks5://host.docker.internal:9050")
driver = webdriver.Remote(command_executor="http://localhost:4444/wd/hub", desired_capabilities=opts.to_capabilities())

driver.get("http://jsonip.com/")
print(driver.find_element_by_css_selector("html").text)
driver.quit()

这是selenium hubtor proxy一起工作的方式。您可以在docker中创建网络,将容器附加到该网络,然后使用容器名称代理主机:

docker network create mynetwork
docker run -it -p 8118:8118 -p 9050:9050 --name tor-proxy -d dperson/torproxy
docker run -d -p 4444:4444 --name selenium-hub -v /dev/shm:/dev/shm selenium/standalone-chrome:3.141.59-yttrium
docker network connect mynetwork hub
docker network connect mynetwork tor-proxy

以下是使用docker compose的示例:

version: '3.5'

services:

  tor-proxy:
    image: dperson/torproxy
    container_name: tor-proxy
    ports:
      - "8118:8118"
      - "9050:9050"
    networks:
      - mynetwork

  selenium-hub:
    image: selenium/standalone-chrome:3.141.59-yttrium
    container_name: selenium-hub
    ports:
      - "4444:4444"
    networks:
      - mynetwork

networks:
  mynetwork:
    name: mynetwork
    driver: bridge

Python代码:

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--no-sandbox")
opts.add_argument("--disable-dev-shm-usage")
opts.add_argument("--proxy-server=socks5://tor-proxy:9050")
driver = webdriver.Remote(command_executor="http://localhost:4444/wd/hub", desired_capabilities=opts.to_capabilities())

driver.get("http://jsonip.com/")
print(driver.find_element_by_css_selector("html").text)
driver.quit()

结果:

{“ ip”:“ 18.27.197.252”,“关于”:“ https://jsonip.com/about”,“ Pro!”:“ http://getjsonip.com”,“获取 通知”:“ https://jsonip.com/notify”}

以退出代码0结束的过程

再次运行相同的代码:

{“ ip”:“ 178.165.72.177”,“关于”:“ https://jsonip.com/about”,“ Pro!”:“ http://getjsonip.com”,“获取 通知”:“ https://jsonip.com/notify”}

以退出代码0结束的过程