Selenium遍历DataFrame时跳过部分链接问题排查
Selenium爬取随机跳过页面的问题分析及解决
为什么不是单纯的等待时长问题?
显式等待超时会直接抛出TimeoutException,如果没做异常捕获,程序会崩溃而非卡顿后继续。你遇到的卡顿后继续,本质是浏览器在等待某类资源加载超时后自行终止请求,代码未感知到页面异常,直接跳过了数据提取步骤,并非等待时长设置的问题。
随机跳过页面的核心原因
- 页面加载异常未处理:部分页面因网络波动、反爬限制、服务器响应慢,导致页面卡住。浏览器默认等待约2分钟后放弃加载,但此时DOM结构不完整,你的代码找不到目标元素,又没加异常捕获,直接进入下一个链接。
- 默认加载策略拖慢进程:Selenium默认的
normal加载策略会等待页面所有资源(图片、广告脚本、统计JS)加载完成,第三方资源加载缓慢会导致浏览器假死2分钟,之后虽然恢复,但目标元素可能未渲染,数据提取失败。 - 元素定位无容错机制:如果用
find_element定位店铺信息,一旦元素不存在会抛出NoSuchElementException,未捕获的话会直接终止当前循环的后续操作,看起来像“跳过”。 - 浏览器资源泄漏:爬取1800个页面后,浏览器内存、CPU占用过高,导致部分页面渲染卡顿甚至进程假死,系统恢复后页面已不可用,无法提取数据。
解决办法
- 修改页面加载策略:用
eager策略只等待DOM加载完成,跳过非必要资源:from selenium.webdriver.chrome.options import Options options = Options() options.page_load_strategy = 'eager' driver = webdriver.Chrome(options=options) - 添加异常捕获与日志:给每个页面的操作加
try-except,记录失败的链接和原因:import logging logging.basicConfig(filename='crawl_errors.log', level=logging.ERROR) for idx, url in enumerate(df['links']): try: driver.get(url) # 显式等待核心元素加载 WebDriverWait(driver, 12).until(EC.presence_of_element_located((By.CLASS_NAME, 'shop-name'))) # 提取数据逻辑 shop_name = driver.find_element(By.CLASS_NAME, 'shop-name').text shop_addr = driver.find_element(By.CLASS_NAME, 'shop-addr').text # 提取产品状态 product_status = [elem.get_attribute('class') for elem in driver.find_elements(By.CLASS_NAME, 'product-item')] # 存入DataFrame except Exception as e: logging.error(f"链接 {url} 处理失败: {str(e)}") print(f"第 {idx+1} 个链接处理失败,详情见日志") continue - 定期重启浏览器:每爬取50-100个页面后重启浏览器,避免资源耗尽:
if idx % 60 == 0 and idx != 0: driver.quit() driver = webdriver.Chrome(options=options) - 设置请求超时:限制浏览器请求超时时间,避免长时间卡住:
options.add_argument('--timeout=30000') # 30秒超时
内容的提问来源于stack exchange,提问作者VSherr
相关产品推荐
相关产品推荐

