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

如何实现论坛post-content爬取写入CSV并循环处理所有页面?

问题分析与代码修正

你的代码存在多处逻辑和语法问题,导致无法正确提取帖子内容并完成批量爬取,具体问题及修正方案如下:

核心问题点

  • 无效导入干扰实例:import driver as driver 完全多余,且会和后续创建的driver对象冲突,直接删除。
  • 等待对象初始化过早:WebDriverWait必须在driver实例创建后初始化,否则会触发未定义错误。
  • 链接去重逻辑冗余:循环内重复执行去重操作浪费资源,应在所有链接收集完成后统一去重。
  • 内容提取逻辑缺失:当前仅在最后一个标签页提取一次内容,未遍历所有帖子页面;且未处理标签页切换与关闭逻辑。
  • 未等待元素加载:打开新页面后直接查找元素,大概率因页面未加载完成导致获取失败,需显式等待元素出现。
  • 内容写入错误:直接将元素对象列表写入CSV,无法得到文本内容;需提取元素文本后再写入,同时用with语句管理文件避免资源泄漏。

修正后的完整代码

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.window import WindowTypes
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
import csv

options = webdriver.ChromeOptions()
options.add_experimental_option("detach", True)
options.add_argument("start-maximized")

# 先初始化浏览器驱动,再创建等待对象
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
wait = WebDriverWait(driver, 10)

# 打开论坛列表页面
driver.get("https://navalcommand.enjin.com/forum/viewforum/2989694/m/11178354/page/1")

# 直接筛选含viewthread的链接,减少后续判断
elems = driver.find_elements(By.XPATH, "//table[@class='structure small-cells']//a[contains(@href, 'viewthread')]")
links = [ele.get_attribute("href") for ele in elems]
# 去重处理
links = list(dict.fromkeys(links))

# 使用with语句自动管理文件关闭
with open(r"C:\Users\jammi\OneDrive\Desktop\Navcom\test.csv", 'w', encoding='UTF8', newline='') as f:
    csv_writer = csv.writer(f)
    # 写入表头(可选,根据需求调整)
    csv_writer.writerow(["帖子内容"])
    
    for link in links:
        # 打开新标签页访问帖子
        driver.switch_to.new_window(WindowTypes.TAB)
        driver.get(link)
        
        try:
            # 等待所有帖子内容元素加载完成
            post_elements = wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, "post-content")))
            # 提取每个元素的文本并写入CSV
            for elem in post_elements:
                content_text = elem.text.strip()
                if content_text:  # 跳过空内容
                    csv_writer.writerow([content_text])
        finally:
            # 关闭当前帖子标签页
            driver.close()
            # 切回论坛列表页的标签
            driver.switch_to.window(driver.window_handles[0])

# 全部完成后关闭浏览器
driver.quit()

额外说明

  • 用contains(@href, 'viewthread')简化XPATH筛选,直接获取目标链接,无需额外判断。
  • newline=''参数解决Windows系统下CSV自动添加空行的问题。
  • try...finally确保即使爬取某帖子出错,也能正常关闭标签页并继续后续爬取。
  • 显式等待presence_of_all_elements_located确保元素加载完成后再提取,避免空列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:31:11