Linode Ubuntu20.04环境下Selenium搭配Chromium无法加载特定网站图片
解决与排查步骤
- 修正服务器场景下Chromium的启动配置参数
- Linode Ubuntu实例默认的
/dev/shm分区容量仅64M,会触发Chromium加载大尺寸图片时的内存分配失败,直接静默丢弃图片请求,本地虚拟机因为共享主机内存不会复现该问题。必须新增两个启动参数:--no-sandbox、--disable-dev-shm-usage - 强制开启渲染层的图片加载开关,新增参数
--blink-settings=imagesEnabled=true。Ubuntu源适配的Chromium版本在无GUI运行环境下,可能因沙箱权限判定异常默认关闭图片加载能力,且不会输出明确的加载失败报错 - 解决UA与浏览器实际指纹不匹配导致的CDN拦截
- 当前使用
fake_useragent生成的随机UA,会与服务器上固定版本Chromium的实际TLS握手指纹存在版本不匹配问题。目标网站的图片CDN会校验UA声称的浏览器版本与实际TLS指纹的匹配度,不匹配时直接拒绝返回图片资源。这也是同环境下Firefox可以正常加载图片的核心原因——Firefox的TLS指纹与自身默认标识天然匹配,不会被CDN判定为异常客户端 - 移除随机UA的调用逻辑,手动执行
chromium-browser --version获取本地安装的精确版本号,将对应版本号拼接为标准桌面端Chrome UA字符串传入配置,不要使用随机生成的高版本Chrome标识 - 替换旧版headless渲染模式
- 将原有的
--headless参数替换为--headless=new,搭配新增的--disable-gpu参数,规避旧版headless模式下目标网站因渲染特性检测失败拦截图片资源的问题 - 检查所有启动参数中是否存在
--disable-images类的全局拦截规则,确认图片请求没有被本地配置阻断 - 问题验证方法
- 调整配置后开启Chromium的网络请求日志,过滤图片类型请求的返回状态码,定位是CDN返回403拒绝、还是本地内存不足导致的请求失败,不要仅通过截图判断加载状态
调整后的核心代码片段
if browser == 'chrome': options = webdriver.ChromeOptions() options.add_argument(f'--proxy-server={proxy}') if headless: # 替换旧版headless为新版渲染引擎 options.add_argument('--headless=new') # 替换随机UA,传入与本地Chromium版本完全匹配的固定UA options.add_argument('user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36') # 补充云服务器环境必选配置 options.add_argument('--no-sandbox') options.add_argument('--disable-dev-shm-usage') options.add_argument('--blink-settings=imagesEnabled=true') options.add_argument('--disable-gpu') driver = webdriver.Chrome(PATH, options=options)
内容的提问来源于stack exchange,提问作者user8511791
相关产品推荐
相关产品推荐

