You need to enable JavaScript to run this app. 为什么Chrome headless模式下爬取的HTML不完整?如何完整爬取?
优惠活动
大模型
产品
解决方案
定价
更多

为什么Chrome headless模式下爬取的HTML不完整?如何完整爬取?

无头与有头模式爬取结果不一致的核心原因
  • 响应式视口尺寸不匹配:旧版Chrome无头模式默认视口尺寸仅为800x600,ATP排名页为完全响应式站点,当检测到浏览器窗口尺寸小于桌面端阈值时,会直接调整DOM结构,移除桌面端专属的导航类下拉组件,替换为适配小屏的移动端导航结构,此时查找的ul.dropdown从根源上就没有被渲染进当前返回的HTML中。
  • 浏览器环境标识差异触发的反爬拦截:旧版无头模式的默认User-Agent会携带HeadlessChrome特殊字段,同时navigator.webdriver属性会被默认置为true,ATP站点的前端脚本会检测这些自动化环境特征,直接返回简化版DOM,不会加载完整的交互组件(包括目标下拉导航)。
  • 新旧无头渲染管线逻辑不统一:代码中使用的headless启动参数是Chrome 109版本之前的旧版无头实现,和有头模式的渲染逻辑、JS执行时机、组件加载优先级完全独立,存在大量渲染行为差异,很多依赖浏览器环境判断的前端组件在旧无头模式下会直接跳过渲染。
无头模式下获取完整HTML的实现方案

无需放弃无头模式,按以下步骤调整配置即可对齐有头模式的爬取效果:

  1. 替换旧版无头参数,使用和有头模式完全同渲染管线的新版无头启动参数,适配Chrome 109以上版本:将options.add_argument("headless")替换为options.add_argument("--headless=new")
  2. 强制指定桌面端视口尺寸,避免响应式匹配到移动端结构:添加options.add_argument("--window-size=1920,1080")
  3. 自定义桌面端UA,隐藏无头特征:添加options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36")
  4. 关闭自动化特征标记,避免触发站点反爬逻辑:
    • options.add_experimental_option("excludeSwitches", ["enable-automation"])
    • options.add_experimental_option("useAutomationExtension", False)
  5. 规避特殊环境下的渲染异常:按需添加--no-sandbox、--disable-dev-shm-usage、--disable-gpu启动参数
  6. 不直接在页面加载完成瞬间拉取源码,添加显式等待逻辑,等目标下拉组件完成渲染后再获取页面内容:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 最长等待10秒,直到目标ul元素出现在DOM中
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "ul.dropdown"))
)
html = driver.page_source
修正后的完整参考代码

注意:Selenium 4.x版本已废弃旧的chrome_options传参方式,直接使用options关键字传入配置对象即可。

from selenium import webdriver
from bs4 import BeautifulSoup as bs
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
# 启用新版无头模式
options.add_argument("--headless=new")
# 指定桌面端视口尺寸
options.add_argument("--window-size=1920,1080")
# 自定义普通桌面Chrome UA
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36")
# 关闭自动化特征
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option("useAutomationExtension", False)
# 环境兼容参数
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")

driver = webdriver.Chrome(<chromedriver path>, options=options)
driver.get("https://www.atptour.com/en/rankings/singles")
# 等待目标元素渲染完成
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "ul.dropdown"))
)
html = driver.page_source
soup = bs(html, "html.parser")
dropdown = soup.find("ul", class_="dropdown")

内容的提问来源于stack exchange,提问作者Jossy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 20:54:04