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'(追加模式),同时还要处理表头的问题——避免每次循环都重复写入表头。
修复思路:
- 打开文件时使用
'a'模式,配合newline=''避免CSV出现空行 - 判断文件是否存在,仅在第一次写入时添加表头
示例代码片段:
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
相关产品推荐
相关产品推荐

