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

标签 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())

然后,当我尝试打开任何页面时,我收到错误消息,提示检查您的代理设置或联系您的网络管理员

虽然在常规代理上使用相同的代码示例 - 它工作得很好。 当我通过 9050 端口发出大胆的请求时——它工作得很好。

最后,当我将相同的代码示例与 webdriver.Chrome 而不是 webdriver.Remote 一起使用时,它工作正常!

我将不胜感激任何通过 Remote webdriver 使事情正常进行的建议。

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

最佳答案

对于 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","Get Notifications": "https://jsonip.com/notify"}

Process finished with exit code 0

使用更改后的 IP 再次运行:

{"ip":"178.165.72.177","about":"https://jsonip.com/about","Pro!":"http://getjsonip.com","Get Notifications": "https://jsonip.com/notify"}

Process finished with exit code 0

关于python - Selenium webdriver.Remote 驱动程序不适用于 tor 代理(webdriver.Chrome 可以),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59159994/

相关文章:

python - 同时运行两个接受参数和返回列表的函数?

python - 在基于类的 ListView 中选择带有复选框的对象

selenium - 测试结果报告

python - 鉴于它们有一些共同点,对数据框进行分组

python - 解释sklearn的scale()和乘以STD并加上平均值之间的区别

python - 我想在打开浏览器之前清除浏览历史记录

selenium - 如何将参数从jenkins传递到selenium

docker - 使用 SSL 和基本身份验证在 AWS ECS 上运行私有(private) docker 注册表 v2

nginx - 如何将 Dokku 应用程序指向 dokku 服务器的根域

docker - 如何在Linux上运行Visual Studio 2019生成的Dockered ASP.net核心应用程序? SSL配置问题