Docker容器内Python爬虫urllib3请求被拒问题排查求助
Hey,看了你的问题和日志,我发现几个关键线索,帮你梳理下:
首先,从日志里能看到你的脚本一直在正常切换代理IP,但最终报错是连接/session/175ce1981a369f6af0ac28924ea8a3e9/url这类路径被拒绝——这个路径格式太熟悉了,明显是Selenium WebDriver的会话API地址,不是直接请求目标网站的地址!
结合你说的“容器外正常跑,容器内就被拒”,十有八九是你用了Selenium或者类似的浏览器自动化工具,但容器里没搞定浏览器和驱动的配置,或者WebDriver的连接地址不对。
下面给你一步步排查的方向:
1. 先确认容器里的浏览器和驱动是否配齐、版本兼容
- 如果用Chrome,在容器里执行
google-chrome --version和chromedriver --version,这俩的大版本必须一致(比如Chrome是114.x,驱动也得是114.x),版本不匹配直接连不上。 - 要是Firefox,就查
firefox --version和geckodriver --version的兼容性,同样版本得对应上。 - 要是压根没装浏览器/驱动,那肯定直接跪,先补上再说。
2. 检查WebDriver的连接地址别用localhost
容器里的localhost指的是容器自己,不是宿主机!如果你是在宿主机上启动的WebDriver服务,容器里得用宿主机的内网IP,或者Docker提供的特殊地址:
- Linux系统:用Docker默认网关
172.17.0.1 - Windows/Mac:用
host.docker.internal
举个例子,原来的代码可能是这样:
driver = webdriver.Remote(command_executor='http://localhost:4444/wd/hub')
改成容器能用的:
# Linux环境 driver = webdriver.Remote(command_executor='http://172.17.0.1:4444/wd/hub') # Windows/Mac环境 driver = webdriver.Remote(command_executor='http://host.docker.internal:4444/wd/hub')
3. 代理的额外排查
虽然你说ping和端口通,但容器的出口IP和宿主机不一样,有些代理会限制来源IP,宿主机能访问的代理,容器可能被拦截。你可以在容器里直接用curl测试代理是否能正常访问目标网站:
curl -x http://37.201.115.94:80 https://目标网站地址
看看能不能拿到正常响应,排除代理本身的问题。
4. 试试host网络模式
如果上面的方法都不行,可以先把容器的网络模式改成host,让容器直接用宿主机的网络栈,这样网络环境和宿主机完全一致,测试下是否还会报错:
docker run --network host your-python-crawler-image
额外小建议
要是用Selenium,其实没必要自己在容器里装浏览器和驱动,直接用官方封装好的镜像更省心,比如selenium/standalone-chrome:
先启动Selenium容器:
docker run -d -p 4444:4444 selenium/standalone-chrome
然后你的爬虫代码里直接连接这个容器的地址(如果是用Docker Compose,直接用容器名称当hostname就行):
driver = webdriver.Remote(command_executor='http://selenium-container:4444/wd/hub')
内容的提问来源于stack exchange,提问作者Securiter

