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

Selenium Python爬虫分页爬取与CSV写入问题求助

问题分析与解决方案

看起来你遇到的两个问题都是爬虫脚本里常见的逻辑小问题,我来帮你逐一解决:


问题1:仅跳转至最后一页,无法遍历所有页面

这个问题大概率是因为你没有循环遍历每一页,而是直接把页码设置成了最大值(比如MAX_PAGE_NUM=67),跳过了中间的页面。

修复思路:

需要用for循环从第1页到MAX_PAGE_NUM依次处理每一页,同时确保每次循环都正确加载对应页面(不管是通过URL参数跳转,还是点击分页按钮)。另外要加上页面加载等待,避免页面还没加载完就执行下一步操作。

示例代码片段:

# 遍历1到MAX_PAGE_NUM的所有页面
for page_num in range(1, MAX_PAGE_NUM + 1):
    print(f"正在处理第 {page_num} 页...")
    # 情况1:如果页码在URL参数里(比如https://xxx.com?page=1)
    current_url = f"你的目标网址?page={page_num}"
    driver.get(current_url)
    
    # 情况2:如果是点击分页按钮跳转(比如"下一页"或页码按钮)
    # page_btn = driver.find_element(By.XPATH, f"//a[text()='{page_num}']")
    # page_btn.click()
    
    # 等待页面加载完成(替换成你页面里的核心元素定位)
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CLASS_NAME, "你要爬取的条目类名"))
    )
    
    # 这里写爬取当前页面条目的逻辑
    # ...

问题2:CSV文件被覆盖而非追加

这是因为你打开CSV文件时用了'w'(写入模式),这个模式会清空原有文件再写入新内容。需要改成'a'(追加模式),同时还要处理表头的问题——避免每次循环都重复写入表头。

修复思路:

  1. 打开文件时使用'a'模式,配合newline=''避免CSV出现空行
  2. 判断文件是否存在,仅在第一次写入时添加表头

示例代码片段:

import os
csv_file = "爬取结果.csv"
# 检查文件是否存在,用于判断是否需要写入表头
file_exists = os.path.isfile(csv_file)

# 在每一页爬取完成后,追加写入CSV
with open(csv_file, 'a', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    # 只有文件不存在,且是第一次爬取时才写表头
    if not file_exists:
        writer.writerow(["列1名称", "列2名称", "列3名称"])
    # 写入当前页面爬取到的所有条目
    writer.writerows(当前页面的条目数据列表)

整合后的完整示例脚本

import csv
import os
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

MAX_PAGE_NUM = 67
CSV_FILE = "scraped_items.csv"

# 初始化浏览器
driver = webdriver.Chrome('/Users/你的ChromeDriver路径')
file_exists = os.path.isfile(CSV_FILE)

try:
    for page_num in range(1, MAX_PAGE_NUM + 1):
        print(f"正在爬取第 {page_num} 页...")
        # 替换成你的目标网站分页URL规则
        target_url = f"https://你的目标网站.com/page/{page_num}"
        driver.get(target_url)
        
        # 等待页面核心元素加载完成(根据实际页面调整定位)
        WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "item-card"))
        )
        
        # 爬取当前页面的条目数据(示例,根据实际页面调整)
        items = driver.find_elements(By.CLASS_NAME, "item-card")
        data_rows = []
        for item in items:
            title = item.find_element(By.TAG_NAME, "h2").text
            price = item.find_element(By.CLASS_NAME, "price").text
            data_rows.append([title, price])
        
        # 追加写入CSV
        with open(CSV_FILE, 'a', newline='', encoding='utf-8') as f:
            writer = csv.writer(f)
            if not file_exists:
                writer.writerow(["商品标题", "商品价格"])
                file_exists = True  # 标记已写入表头,后续不再重复写入
            writer.writerows(data_rows)
finally:
    # 不管成功失败,最后关闭浏览器
    driver.quit()
    print("爬取完成!")

额外注意事项

  • 如果网站的分页是通过"下一页"按钮跳转,而非URL参数,那循环逻辑要改成点击"下一页",直到按钮不可用为止
  • 可以添加随机等待时间(比如time.sleep(random.uniform(1,3))),避免触发网站反爬机制
  • 确保你的ChromeDriver版本和Chrome浏览器版本匹配,否则会出现启动失败的问题

内容的提问来源于stack exchange,提问作者Reezal AQ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:54:07