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

如何在Selenium分页爬取时实现循环索引累加而非重置?

解决Selenium分页爬取时索引累加的问题

嘿,我懂你碰到的麻烦了——每次切换分页后,enumerate都会从头开始计数,结果150条数据的索引一直在0-14循环,完全没法得到连续的全局索引对吧?这其实是因为每次进入新的分页循环,enumerate都是重新初始化的,所以得在循环外部维护一个全局的计数器,或者给enumerate指定起始值来实现累加。

给你两种简单的解决方法:

方法一:手动维护全局计数器

在while循环外面初始化一个索引变量,每处理完一条数据就把它加1,这样就能保证索引一直连续累加:

import time
import random

# 初始化全局索引,从0开始计数
total_idx = 0
while next_page is not None:
    # 注意:每次翻页后必须重新定位列表元素,否则会出现过期元素异常
    company_links_elements = driver.find_elements(By.XPATH, "你的列表元素定位表达式")
    # company_address_elements = driver.find_elements(...) 同样需要重新定位
    
    for company in company_links_elements:
        company_id = total_idx
        company_url = company.get_attribute("href")
        # 如果你需要获取公司名称、地址,记得用重新定位后的元素列表
        # company_name = company.get_attribute("text")
        # current_local_idx = total_idx % 15  # 计算当前页的局部索引,用于取地址元素
        # company_address = remove_html_tags(company_address_elements[current_local_idx].get_attribute("innerHTML"))
        
        writer.writerow((total_idx, company_url))
        # 每处理一条数据,全局索引加1
        total_idx += 1
        time.sleep(random.randint(1, 3))
    
    next_page.click()
    # 点击下一页后加个等待,确保页面加载完成
    time.sleep(random.randint(2, 4))
    # 重新定位下一页按钮,避免过期
    next_page = driver.find_element(By.XPATH, "你的下一页按钮定位表达式") if driver.find_elements(By.XPATH, "你的下一页按钮定位表达式") else None

方法二:利用enumerate的start参数

enumerate其实支持指定start参数,我们可以把当前的全局索引传进去,让它从这个值开始计数,处理完当前页后再更新全局索引:

import time
import random

total_idx = 0
while next_page is not None:
    company_links_elements = driver.find_elements(By.XPATH, "你的列表元素定位表达式")
    # company_address_elements = driver.find_elements(...)
    
    # 让enumerate从当前total_idx开始计数
    for idx, company in enumerate(company_links_elements, start=total_idx):
        company_id = idx
        company_url = company.get_attribute("href")
        # company_name = company.get_attribute("text")
        # current_local_idx = idx - total_idx  # 计算当前页的局部索引,用于取地址元素
        # company_address = remove_html_tags(company_address_elements[current_local_idx].get_attribute("innerHTML"))
        
        writer.writerow((idx, company_url))
        time.sleep(random.randint(1, 3))
    
    # 更新全局索引,加上当前页的条目数量
    total_idx += len(company_links_elements)
    next_page.click()
    time.sleep(random.randint(2, 4))
    next_page = driver.find_element(By.XPATH, "你的下一页按钮定位表达式") if driver.find_elements(By.XPATH, "你的下一页按钮定位表达式") else None

重要提醒

不管用哪种方法,每次切换分页后都必须重新定位页面上的元素(包括列表项、下一页按钮),因为之前定位的元素会因为页面刷新变成“过期元素”,继续使用会抛出StaleElementReferenceException异常,这是很多新手容易踩的坑哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:08:02