如何在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
相关产品推荐
相关产品推荐

