如何将Selenium多链接爬虫的抓取结果统一保存到单个CSV文件
多链接Kayak航班数据合并存储CSV解决方案
核心修改逻辑
- 在遍历链接的循环外定义总列表,存储所有抓取到的航班数据,避免单次循环结束后数据被覆盖
- 调整浏览器驱动的生命周期:将驱动初始化放在循环内,每次爬完一个链接再销毁,避免调用quit()后无法操作后续链接
- 将航班详情列表转为用特殊分隔符(如|)拼接的字符串,适配CSV的单元格存储格式
- 所有链接爬取完成后,统一将总列表写入同一个CSV文件
完整可运行代码
from selenium import webdriver import time import csv # 存储所有航班数据的总列表 all_flights = [] list_link = ['https://www.kayak.it/flights/MIL-PAL/2021-09-05/2021-09-06/?sort=bestflight__a&fs=stops=0', 'https://www.kayak.it/flights/MIL-ROM/2021-09-05/2021-09-06/?sort=bestflight__a&fs=stops=0'] for link in list_link: # 每次循环初始化一次驱动 driver = webdriver.Chrome(executable_path="你的ChromeDriver路径") driver.maximize_window() driver.implicitly_wait(10) driver.get(link) time.sleep(5) flights = driver.find_elements_by_class_name("resultInner") print(f"当前链接{link}抓取到航班数:{len(flights)}") for flight in flights: driver.execute_script("arguments[0].scrollIntoView(true);", flight) driver.execute_script("window.scrollBy(0,-300)") flightdetails = {} frowdet = [] details = flight.find_elements_by_xpath(".//div[@class='mainInfo']//li") for d in details: fd = "" sd = "" first = d.find_elements_by_xpath(".//div[@class='top']") for f in first: fd += f.get_attribute("innerText") + ' ' second = d.find_elements_by_xpath(".//div[@class='bottom']//span") for s in second: sd += s.get_attribute("innerText") detstr = sd + ' - ' + fd frowdet.append(detstr) # 提取完整价格,原代码仅取前两位会丢失数据,可根据需要调整 fprice = flight.find_element_by_xpath(".//span[@class='price-text']").get_attribute("innerText").replace("€", "").strip() # 航班列表转为|分隔的字符串 flightdetails["出发-到达航线"] = "|".join(frowdet) flightdetails["价格(欧元)"] = fprice # 追加到总列表 all_flights.append(flightdetails) driver.quit() # 写入CSV文件 if all_flights: with open("kayak_flights.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=all_flights[0].keys()) writer.writeheader() writer.writerows(all_flights) print(f"所有数据已写入kayak_flights.csv,共{len(all_flights)}条记录")
注意事项
- 需替换代码中
你的ChromeDriver路径为本地实际的ChromeDriver文件路径 - 如果使用Selenium 4.x版本,需要把
find_elements_by_xx的写法替换为find_elements(By.xx, 定位值),同时顶部导入from selenium.webdriver.common.by import By - 如果爬取过程中出现元素找不到的问题,可适当延长
time.sleep的等待时长,或者改用显示等待逻辑 - 代码使用utf-8-sig编码存储CSV,用Excel打开不会出现乱码问题
内容的提问来源于stack exchange,提问作者Box
相关产品推荐
相关产品推荐

