python - Selenium webdriver.Remote 驱动程序不适用于 Tor 代理(webdriver.Chrome 可以)
问题描述
我正在尝试在我的远程驱动程序上使用 socks5 代理,该驱动程序作为 docker 容器托管在端口 4444 上。
这是代码示例:
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 image 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 hub与tor 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
蟒蛇代码:
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 结束
推荐阅读
- python - AWS CDK Python - 在其他项目堆栈文件中重用 config.py 文件中的代码块
- javascript - SPA/AJAX 导致其他 javascript 无法工作
- javascript - javascript ndefREADER 不会自动加载
- .net-core - Azure DevOps:不将调试信息发布到符号服务器
- matplotlib - 为函数 set_xlim 和 set_ylim 设置手动间隔
- python - gdf.to_file 数值处理
- javascript - 如何强制从运行在 HTTPS 上的前端发出 HTTP 请求?
- html - 反应错误刷新时在此服务器上找不到请求的URL
- asp.net-core - 如果在发布文件夹外执行 dotnet,dotnet 不会加载 appsettings.json
- typescript - 删除`··`,替换`············` 为`······` eslint() eslintprettier/prettier