【问题标题】:Selenium webdriver.Remote driver does not work with tor proxy(webdriver.Chrome does)Selenium webdriver.Remote 驱动程序不适用于 Tor 代理(webdriver.Chrome 可以)
【发布时间】:2020-03-28 07:26:17
【问题描述】:

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

【问题讨论】:

  • 能否提供您正在使用的chromedriver版本和selenium包版本?谢谢。
  • @alecxe,感谢您与我们联系。我已经用版本更新了问题正文。
  • tor 代理是在主机上还是在容器中运行?
  • @pguardiario tor 代理正在本地主机上运行,​​但它可以从容器内部和本地主机访问(并且可以正常工作,例如使用requests lib)。
  • 好的,但是 ip 会与容器内部不同,是吗?

标签: python selenium docker selenium-chromedriver tor


【解决方案1】:

建议你在 docker config.json 文件中添加你的代理配置:

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "socks5://127.0.0.1:9050",
     "httpsProxy": "socks5://127.0.0.1:9050"
   }
 }
}

并从你的 python 脚本中删除它

【讨论】:

  • 试过这个,但不幸的是我得到了同样的错误,Check your proxy settings or contact your network administrator.
  • 添加配置后是否重启了docker服务?
  • 是的,做了两次。您是否尝试过使用这样的 config.json 构建 webdriver 并且对您有用?
  • 我在我的 docker 中使用一些代理来连接互联网,但不用于 webdriver
【解决方案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://127.0.0.1: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://127.0.0.1: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","about":"https://jsonip.com/about","Pro!":"http://getjsonip.com","获取 通知”:“https://jsonip.com/notify”}

进程以退出代码 0 结束

使用更改的 IP 再次运行:

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

进程以退出代码 0 结束

【讨论】:

  • 非常感谢您的回答,它确实按照您描述的方式工作。无论如何,您有什么建议为什么它不适用于在 localhost 上启动的 tor 代理?
  • @AnSe 你的操作系统是什么?你试过host.docker.internal吗?
  • 该死的它与host.docker.internal 一起工作,无需额外设置tor 容器! linux中是否有host.docker.internal的替代品(据我所知,它只在windows&macos中可用)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2017-04-07
  • 2019-01-13
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多