Python Selenium webdriver.远程驱动程序不能与tor代理一起使用(webdriver.Chrome可以)

Python Selenium webdriver.远程驱动程序不能与tor代理一起使用(webdriver.Chrome可以),python,selenium,docker,selenium-chromedriver,tor,Python,Selenium,Docker,Selenium Chromedriver,Tor,我正试图在我的电脑上使用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 = webdriv

我正试图在我的电脑上使用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
时,它工作得很好

我将感谢任何建议,使事情通过远程webdriver的工作

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

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

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

并将其从python脚本中删除

对于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()
以下是如何使用。您可以在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”,“关于”:https://jsonip.com/about“,“专业人士”:”http://getjsonip.com“,”得到 通知“:”https://jsonip.com/notify“}

进程已完成,退出代码为0

使用更改的IP重新运行:

{“ip”:“178.165.72.177”,“关于”:https://jsonip.com/about“,“专业人士”:”http://getjsonip.com“,”得到 通知“:”https://jsonip.com/notify“}

进程已完成,退出代码为0


请提供您正在使用的chromedriver版本和selenium软件包版本,好吗?谢谢。@alecxe,谢谢你伸出援手。我已经用版本更新了问题正文。tor proxy是在主机上还是在容器中运行?@pguardiario tor proxy是在localhost上运行的,但是它可以从容器内部和localhost中访问(并且可以工作,例如使用
请求
lib)。好的,但是ip将与容器内部不同,是吗?尝试了这个,但不幸的是,我遇到了相同的错误,
请检查代理设置或与网络管理员联系。
添加配置后是否重新启动docker服务?是的,执行了两次。你有没有尝试用这样的config.json构建webdriver,它对你有用?我在docker中使用了一些代理用于internet连接,但不是webdriver。非常感谢你的回答,它确实按照你描述的方式工作。顺便问一下,你有什么建议,为什么它不能与本地主机上启动的tor proxy一起工作?@AnSe你的操作系统是什么?你试过使用
host.docker.internal
?该死的,它可以使用
host.docker.internal
,不需要对tor容器进行额外的设置!linux中是否有
host.docker.internal
的替代方案(据我所知,它仅在windows和macos中可用)?