Python基于Selenium多页爬取时循环失效问题排查
问题根因
脚本重复抓取第一页由以下逻辑错误导致:
- 核心错误:
content是首次加载搜索结果页时获取的旧DOM引用,翻页后页面DOM会刷新,始终用旧引用查找数据永远只能拿到第一页内容 - 选择器错误:多个CLASS选择器末尾带多余空格,Selenium类名选择器为精确匹配,多余空格会导致元素定位失效
- 翻页逻辑错误:翻页按钮使用写死的绝对XPath,页面结构微调就会定位失败;点击翻页后未等待新页面加载就进入下一轮抓取;按钮点击代码缩进错误,被嵌套在文件写入逻辑内
- 变量逻辑混乱:多层无意义嵌套循环导致
result、header等变量取值异常,写入文件时容易出现索引错误或脏数据 - 等待逻辑不合理:全靠固定时长的
time.sleep等待,要么等待不足页面未加载完成,要么浪费爬取时间
修复说明
- 每轮爬取前重新从当前driver实例获取最新DOM元素,不复用旧页面的元素引用
- 清理CLASS选择器的多余空格,翻页按钮用通用类名定位,替代易失效的绝对XPath
- 点击翻页后增加显式等待,判断旧页面元素失效、新房源加载完成后再执行抓取
- 简化元素定位逻辑,删除无意义的多层嵌套循环,直接定位房源卡片提取字段
- 增加终止判断,找不到下一页按钮时自动停止爬取,无需预先固定爬取页数
- 文件写入增加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
相关产品推荐
相关产品推荐

