You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python基于Selenium多页爬取时循环失效问题排查

问题根因

脚本重复抓取第一页由以下逻辑错误导致:

  • 核心错误:content是首次加载搜索结果页时获取的旧DOM引用,翻页后页面DOM会刷新,始终用旧引用查找数据永远只能拿到第一页内容
  • 选择器错误:多个CLASS选择器末尾带多余空格,Selenium类名选择器为精确匹配,多余空格会导致元素定位失效
  • 翻页逻辑错误:翻页按钮使用写死的绝对XPath,页面结构微调就会定位失败;点击翻页后未等待新页面加载就进入下一轮抓取;按钮点击代码缩进错误,被嵌套在文件写入逻辑内
  • 变量逻辑混乱:多层无意义嵌套循环导致result、header等变量取值异常,写入文件时容易出现索引错误或脏数据
  • 等待逻辑不合理:全靠固定时长的time.sleep等待,要么等待不足页面未加载完成,要么浪费爬取时间
修复说明
  1. 每轮爬取前重新从当前driver实例获取最新DOM元素,不复用旧页面的元素引用
  2. 清理CLASS选择器的多余空格,翻页按钮用通用类名定位,替代易失效的绝对XPath
  3. 点击翻页后增加显式等待,判断旧页面元素失效、新房源加载完成后再执行抓取
  4. 简化元素定位逻辑,删除无意义的多层嵌套循环,直接定位房源卡片提取字段
  5. 增加终止判断,找不到下一页按钮时自动停止爬取,无需预先固定爬取页数
  6. 文件写入增加UTF-8编码,避免特殊字符乱码;增加单卡片异常捕获,个别元素缺失不中断整体爬取
修复后完整代码
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 初始化文件,加编码避免乱码
with open('rightmove.csv', 'w', encoding='utf-8-sig') as file:
    file.write('地址,房型,交易信息\n')

PATH = "/usr/local/bin/chromedriver"
driver = webdriver.Chrome(PATH)
wait = WebDriverWait(driver, 15)

driver.get("https://www.rightmove.co.uk/house-prices.html")
print(driver.title)

# 搜索BR1区域
search_box = driver.find_element(By.NAME, 'searchLocation')
search_box.send_keys('BR1' + Keys.RETURN)

# 等待搜索结果首页加载
wait.until(EC.presence_of_element_located((By.ID, 'content')))
time.sleep(1)

# 循环爬取所有分页,无需预先固定页数
page_num = 1
while True:
    print(f"正在爬取第{page_num}页")
    # 每一页重新获取最新页面内容,不复用旧DOM引用
    content = wait.until(EC.presence_of_element_located((By.ID, 'content')))
    # 直接定位所有房源卡片,删除多余嵌套逻辑
    property_cards = content.find_elements(By.CLASS_NAME, 'propertyCard')
    
    # 提取当前页所有房源数据
    page_data = []
    for card in property_cards:
        try:
            title = card.find_element(By.CLASS_NAME, 'title').text.strip()
            sub_title = card.find_element(By.CLASS_NAME, 'subTitle').text.strip()
            property_type = card.find_element(By.CLASS_NAME, 'propertyType').text.strip()
            page_data.append(f"{title},{property_type},{sub_title}")
        except Exception:
            # 个别卡片元素缺失直接跳过,不中断整体爬取
            continue
    
    # 批量写入当前页数据
    with open('rightmove.csv', 'a', encoding='utf-8-sig') as file:
        for line in page_data:
            file.write(line + '\n')
    
    # 定位下一页按钮,用固定类名定位比绝对XPath稳定
    try:
        next_btn = wait.until(EC.element_to_be_clickable(
            (By.CLASS_NAME, 'pagination-direction--next')
        ))
        # 记录当前页第一个房源卡片,用于判断页面是否跳转
        first_card = property_cards[0]
        next_btn.click()
        # 等待旧房源卡片失效,确认页面开始跳转
        wait.until(EC.staleness_of(first_card))
        # 等待新页面房源加载完成
        wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'propertyCard')))
        page_num += 1
        time.sleep(1)
    except Exception:
        print("没有更多分页,爬取结束")
        break

driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:01:08