如何实现论坛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
相关产品推荐
相关产品推荐

