Selenium访问URL报net::ERR_CONNECTION_RESET错误排查
问题原因
你遇到的net::ERR_CONNECTION_RESET和代码本身的问题可以分成两类:
- 核心拦截原因:Pole Emploi站点配置了反爬WAF规则,你当前用的旧版Chrome无头模式特征非常明显,加上Heroku出口是机房IP段,请求直接被站点识别为爬虫主动重置连接,和Selenium本身的功能无关。
- 代码本身的显性错误:
- 缺少
import os导包语句,代码中调用os.environ时会直接抛出NameError - Chrome启动参数拼写错误:
--disable-dev-sh-usage为错误写法,正确参数是--disable-dev-shm-usage,该参数不生效会导致Heroku这类内存受限的容器环境中Chrome频繁崩溃 - 使用旧版无头模式
--headless,该模式的浏览器指纹和真实用户浏览器差异极大,极易被反爬系统识别 - 未配置基础反检测参数,默认启动的浏览器会携带
webdriver标识、UA带Headless标记,等于主动告知站点自己是爬虫 - 截图保存逻辑错误:最后调用
file_like_object.save()时,file_like_object是存储原始字节的BytesIO对象,不存在save方法,执行到这一步必然报错,正确应该调用PIL解析后的Image对象的save方法。
- 缺少
可直接运行的修复版Selenium代码
修正上述所有问题,补充反爬配置适配站点检测规则:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from PIL import Image import io import os op = webdriver.ChromeOptions() op.binary_location = os.environ.get("GOOGLE_CHROME_BIN") # 启用新版无头模式,指纹与真实Chrome完全一致 op.add_argument("--headless=new") op.add_argument("--no-sandbox") # 修正shm参数,适配Heroku容器环境 op.add_argument("--disable-dev-shm-usage") op.add_argument("--start-maximized") # 基础反检测配置 op.add_argument("--disable-blink-features=AutomationControlled") op.add_argument("--disable-extensions") # 替换为真实桌面版Chrome的UA,移除Headless标识 op.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36") op.add_experimental_option("excludeSwitches", ["enable-automation"]) op.add_experimental_option("useAutomationExtension", False) driver = webdriver.Chrome(executable_path=os.environ.get("CHROMEDRIVER_PATH"), options=op) # 注入JS移除navigator.webdriver标识 driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})" }) # 固定窗口尺寸,避免截图排版错乱 driver.set_window_size(1920, 1080) driver.get("https://candidat.pole-emploi.fr/offres/recherche/detail/136QBXM") # 等待隐私弹窗可点击后关闭 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="footer_tc_privacy_button_2"]'))).click() # 截图逻辑修正 screenshot_bytes = driver.get_screenshot_as_png() screenshot_buffer = io.BytesIO(screenshot_bytes) im = Image.open(screenshot_buffer) output_buffer = io.BytesIO() im.save(output_buffer, format="PNG") # 此处可自行处理output_buffer中的截图数据,比如存文件、上传到存储服务 driver.quit()
替代方案
如果修复后的Selenium依然因为IP问题被拦截,可以选择以下方案:
- 用Playwright替代Selenium:Playwright的浏览器默认做了指纹伪装,无头模式的反检测能力远强于原生Selenium+Chrome,内存占用更低,Heroku上可以直接通过官方buildpack部署,截图API更简洁,不需要手动配置大量反爬参数。
- 静态渲染方案:如果不需要交互、页面内容不需要动态JS加载,可以用
requests拉取页面源码后,搭配wkhtmltoimage这类轻量渲染工具生成截图,资源占用只有Chrome的1/10,缺点是对重度动态渲染的页面适配较差。 - 搭配代理使用:如果站点对机房IP拦截严格,可以给浏览器配置住宅代理,把请求出口换成普通家庭用户IP,绕过IP段封禁规则。
内容的提问来源于stack exchange,提问作者Bruno93600
相关产品推荐
相关产品推荐

