使用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
相关产品推荐
相关产品推荐

