Selenium爬虫仅加载页面骨架无法填充数据,求解决方案
问题描述
开发Python/Selenium脚本爬取某网站公开数据,点击“Search”按钮后仅显示页面骨架,实际数据无法渲染到页面上。Chrome控制台网络标签显示数据已成功获取,但页面始终无内容,同时抛出如下栈追踪错误:
Stacktrace:
GetHandleVerifier [0x00007FF7D8D67D12+55474]
(No symbol) [0x00007FF7D8CD77C2]
(No symbol) [0x00007FF7D8B8E0EB]
(No symbol) [0x00007FF7D8BCEBAC]
(No symbol) [0x00007FF7D8BCED2C]
(No symbol) [0x00007FF7D8C09F77]
(No symbol) [0x00007FF7D8BEF19F]
(No symbol) [0x00007FF7D8C07EF2]
(No symbol) [0x00007FF7D8BEEF33]
(No symbol) [0x00007FF7D8BC3D41]
(No symbol) [0x00007FF7D8BC4F84]
GetHandleVerifier [0x00007FF7D90CB762+3609346]
GetHandleVerifier [0x00007FF7D9121A80+3962400]
GetHandleVerifier [0x00007FF7D9119F0F+3930799]
GetHandleVerifier [0x00007FF7D8E03CA6+694342]
(No symbol) [0x00007FF7D8CE2218]
(No symbol) [0x00007FF7D8CDE484]
(No symbol) [0x00007FF7D8CDE5B2]
(No symbol) [0x00007FF7D8CCEE13]
BaseThreadInitThunk [0x00007FFB49117614+20]
RtlUserThreadStart [0x00007FFB4A3026B1+33]
已尝试以下方案但均无效:
- 脚本休眠10/20/30/60/120秒
- 使用
WebDriverWait等待元素出现/可见 - 为Chrome Driver添加请求头
脚本在部分设备可正常运行,部分设备失败。
可行解决方案
1. 模拟真实浏览器环境,规避自动化检测
Selenium默认特征易被网站识别,导致渲染逻辑异常。可通过以下配置优化:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() # 禁用自动化提示 options.add_experimental_option("excludeSwitches", ["enable-automation"]) options.add_experimental_option('useAutomationExtension', False) # 设置真实用户代理(复制自己浏览器的UA) options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") # 启用JavaScript options.add_argument("--enable-javascript") # 禁用沙箱模式(部分设备环境需要) options.add_argument("--no-sandbox") # 禁用GPU加速(避免渲染冲突) options.add_argument("--disable-gpu") driver = webdriver.Chrome(options=options)
2. 强制触发页面重渲染逻辑
数据已获取说明接口正常,问题出在前端渲染。点击后可执行JavaScript强制触发渲染:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待并点击搜索按钮 search_btn = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "search-button"))) search_btn.click() # 等待页面加载完成后强制触发渲染 WebDriverWait(driver, 20).until(lambda d: d.execute_script("return document.readyState === 'complete'")) # 滚动到结果区域+触发窗口 resize 事件,强制前端重新渲染 driver.execute_script("document.querySelector('.result-list').scrollIntoView(true);") driver.execute_script("window.dispatchEvent(new Event('resize'));")
3. 确保Chrome Driver与浏览器版本完全兼容
跨设备失败的核心原因之一是版本不匹配:
- 查看Chrome版本:打开
chrome://settings/help - 下载对应版本的Chrome Driver
- 替换脚本中的驱动路径
4. 禁用缓存避免旧资源干扰
部分设备的缓存可能导致渲染异常,启动浏览器时清除缓存:
# 启用无痕模式自动隔离缓存 options.add_argument("--incognito") # 或者直接禁用缓存 options.add_argument("--disable-cache") options.add_argument("--disk-cache-size=0")
5. 检查设备系统资源
页面渲染需要足够CPU和内存,性能不足的设备可能出现渲染超时。关闭设备上占用资源的后台程序,或在脚本中添加简单的资源等待逻辑。
内容的提问来源于stack exchange,提问作者Kshitij Dhyani

