Python爬虫循环追加列表仅保留首次迭代结果求助
问题解决:Selenium爬取供应商列表仅保留每页第一条数据
错误原因分析
原代码存在以下几个关键问题导致每页仅保留第一次迭代结果:
- 元素定位错误:使用固定的XPATH获取
name和address,每次都抓取页面上同一个供应商的数据,而非当前遍历的供应商。 - 遍历逻辑混乱:内层循环
range(1,2,1)仅执行一次,且对find_elements返回的列表错误调用find_elements方法,导致无法遍历所有供应商。 - 数据追加位置错误:
siteData.append(...)放在内层循环外,仅在每次内层循环结束时追加一次数据,而非每个供应商对应一次追加。 - 页面切换无等待:点击下一页后直接开始爬取,未等待新页面加载完成,可能导致抓取到旧页面数据或空数据。
修复后的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, NoSuchElementException from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service import time import pandas as pd # 初始化浏览器 driver_service = Service(executable_path=ChromeDriverManager().install()) driver = webdriver.Chrome(service=driver_service) driver.get("https://www.rataindia.com/vendor-listing.php?page=1") wait = WebDriverWait(driver, 10) # 关闭弹窗 try: close_btn = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "close-button"))) driver.execute_script("arguments[0].click();", close_btn) except: pass siteData = [] # 遍历1到81页 for nav in range(1, 82): print(f"正在爬取第{nav}页...") # 等待供应商列表加载完成 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#vendor-block .vendor-item"))) # 获取当前页所有供应商元素 vendors = driver.find_elements(By.CSS_SELECTOR, "#vendor-block .vendor-item") # 遍历每个供应商 for vendor in vendors: try: # 从当前供应商元素内定位名称和地址,避免全局定位错误 name = vendor.find_element(By.CSS_SELECTOR, ".vendor-name").text except NoSuchElementException: name = "无名称" try: address = vendor.find_element(By.CSS_SELECTOR, ".vendor-address").text except NoSuchElementException: address = "无地址" print(f"公司名称: {name}, 地址: {address}") # 将当前供应商数据追加到列表 siteData.append({"company": name, "address": address}) # 保存数据到CSV(可选:可以每爬完一页保存一次,或者最后统一保存) df = pd.DataFrame(siteData) df.to_csv("rataindia12.csv", index=False) # 点击下一页,处理最后一页无下一页按钮的情况 try: next_btn = wait.until(EC.element_to_be_clickable( (By.XPATH, '//*[@id="vendor-block"]/div/div[2]/div/ul/li/a/span[contains(@class, "hidden-xs") and text()="Next"]') )) driver.execute_script("arguments[0].click();", next_btn) # 等待页面切换完成 time.sleep(2) # 等待新页面的供应商列表加载 wait.until(EC.staleness_of(vendors[0])) except (TimeoutException, IndexError): print("已爬完所有页面") break # 关闭浏览器 driver.quit()
关键优化点说明
- 精准元素定位:使用
vendor.find_element(...)从当前供应商元素内定位子元素,确保每次获取的是当前遍历的供应商数据,而非全局第一个元素。 - 正确遍历逻辑:通过
driver.find_elements(By.CSS_SELECTOR, "#vendor-block .vendor-item")获取当前页所有供应商元素,遍历每个元素处理数据。 - 数据追加时机:在每个供应商的遍历循环内执行
siteData.append(...),保证每条供应商数据都被添加到列表。 - 页面加载等待:使用
WebDriverWait等待元素加载,点击下一页后等待旧元素失效(staleness_of),确保新页面加载完成后再爬取。 - 异常处理增强:针对每个字段的获取添加单独的异常捕获,避免单个字段获取失败导致整个循环中断。
- 冗余库清理:移除未使用的
BeautifulSoup、requests等库,简化代码。
内容的提问来源于stack exchange,提问作者Priyanka
相关产品推荐
相关产品推荐

