You need to enable JavaScript to run this app. 使用Selenium搭配for循环爬取多页仅返回第一页数据该如何解决
优惠活动
大模型
产品
解决方案
定价
更多

使用Selenium搭配for循环爬取多页仅返回第一页数据该如何解决

问题排查点

  • 缺失WebDriver实例初始化:仅配置了ChromeOptions,没有实际创建webdriver.Chrome实例,代码运行时调用driver.get会直接报错
  • 循环范围不符合需求:要爬30页的话,当前range(1,10)只会循环1到9共9次,且range是左闭右开规则,爬30页需要写range(1,31)
  • 无页面加载等待逻辑:无头模式下页面资源加载速度不稳定,没有等待会导致后续页面元素还没渲染完成就执行提取逻辑,拿到空数据
  • 最后没有合并各页DataFrame:每页的df存在data列表里,但最终没有用pd.concat合并成完整的总表
  • 绝对路径Xpath稳定性差:使用的全路径Xpath很容易因为页面结构微小变动就定位失败,建议替换成CSS选择器或者相对路径Xpath

修正后可运行代码

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
import pandas as pd

options = webdriver.ChromeOptions()
options.add_argument('--headless=new')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-blink-features=AutomationControlled') # 绕过基础反爬检测,避免被站点拦截

# 初始化driver
driver = webdriver.Chrome(options=options)
# 设置全局隐式等待
driver.implicitly_wait(10)

url = "https://bonbanh.com/oto/page,"
data = []
# 爬取前30页,range左闭右开所以结束值写31
for i in range(1,31):
    driver.get(url + str(i))
    try:
        # 等待列表核心元素加载完成再提取
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".cb2_02"))
        )
        types = [el.text for el in driver.find_elements(By.CSS_SELECTOR, ".cb1")]
        names = [el.text for el in driver.find_elements(By.CSS_SELECTOR, ".cb2_02")]
        prices = [el.text for el in driver.find_elements(By.CSS_SELECTOR, ".cb3")]
        address = [el.text for el in driver.find_elements(By.CSS_SELECTOR, ".cb4")]
        # 校验各字段长度一致再生成df,避免行列不匹配报错
        if len(types) == len(names) == len(prices) == len(address):
            df = pd.DataFrame({'TEN_XE':names,'LOAI_XE':types, 'GIA_XE': prices, 'DIA_CHI': address})
            data.append(df)
            print(f"第{i}页爬取成功,共{len(df)}条数据")
        else:
            print(f"第{i}页字段长度不匹配,跳过")
    except Exception as e:
        print(f"第{i}页爬取失败,错误信息:{str(e)}")
        continue

# 合并所有页的df得到最终结果
final_df = pd.concat(data, ignore_index=True)
print(f"总爬取数据量:{len(final_df)}")
# 可按需导出到csv
# final_df.to_csv("bonbanh_car_data.csv", index=False, encoding='utf-8-sig')

# 关闭driver释放资源
driver.quit()

内容的提问来源于stack exchange,提问作者Son Pham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 10:06:02