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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:30:41