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

如何通过循环为各YouTube频道生成对应命名的CSV文件

问题描述

本人是Python新手,使用Selenium包爬取YouTube频道主页数据,现有代码可正常提取数据并转换为DataFrame,但不清楚如何在遍历urls列表的循环中,利用与urls顺序对应的channel_name列表为生成的CSV文件命名,期望每个URL对应一个以对应频道名命名的CSV,询问是否可在循环内实现该需求。

现有代码如下:

import selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome import service
from selenium.webdriver.common.keys import Keys
import time
import wget
import os
import pandas as pd
import matplotlib.pyplot as plt


urls = [
    'https://www.youtube.com/permalink_1', 
    'https://www.youtube.com/permalink_2', 
    'https://www.youtube.com/permalink_3', 
    'https://www.youtube.com/permalink_4', 
    'https://www.youtube.com/permalink_5', 
    'https://www.youtube.com/permalink_6',
    'https://www.youtube.com/permalink_7',
    'https://www.youtube.com/permalink_8',
    'https://www.youtube.com/permalink_9',
    'https://www.youtube.com/permalink_10',
    'https://www.youtube.com/permalink_11',
    'https://www.youtube.com/permalink_12',
    'https://www.youtube.com/permalink_13',
    'https://www.youtube.com/permalink_14'
]

channel_name = [
    "X_1",
    "X_2",
    "X_3",
    "X_4",
    "X_5",
    "X_6",
    "X_7",
    "X_8",
    "X_9",
    "X_10",
    "X_11",
    "X_12",
    "X_13",
    "X_14"
]


for url in urls:
    PATH = 'C:\\webdrivers\\chromedriver.exe.'
    driver = webdriver.Chrome(PATH)
    driver.get(url)
    #driver.maximize_window()
    driver.implicitly_wait(10)

    for i in range(30):
        driver.find_element(By.TAG_NAME, "Body").send_keys(Keys.END)
        driver.implicitly_wait(20)

    time.sleep(5)

    vid_title = []
    viewers = []
    posted_date = []

    titles = driver.find_elements(By.XPATH, "//a[@id='video-title']")
    views = driver.find_elements(By.XPATH, "//div[@id='metadata-line']/span[1]")
    when = driver.find_elements(By.XPATH, "//div[@id='metadata-line']/span[2]")

    for title in titles:
        vid_title.append(title.text)
        driver.implicitly_wait(5)
    for view in views:
        viewers.append(view.text)
        driver.implicitly_wait(5)
    for posted in when:
        posted_date.append(posted.text)
        driver.implicitly_wait(5)

    vid_item = {
        "video_title" : vid_title,
        "views" : viewers,
        "date_posted" : posted_date
    }

    df = pd.DataFrame(vid_item, columns=["video_title", "views", "date_posted"])
    #df_new = df.transpose()
    print(df)

期望实现的CSV命名格式:

df.to_csv(r"C:\\Users\\........\\IG_{channel_name}.csv", sep=",")

解决方案

完全可以在循环内实现这个需求,核心是用Python的zip()函数同时遍历urls和channel_name两个列表,这样每次循环都能拿到对应的频道URL和频道名称,再用f-string格式化CSV文件名即可。

修改后的完整代码

import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import pandas as pd


urls = [
    'https://www.youtube.com/permalink_1', 
    'https://www.youtube.com/permalink_2', 
    'https://www.youtube.com/permalink_3', 
    'https://www.youtube.com/permalink_4', 
    'https://www.youtube.com/permalink_5', 
    'https://www.youtube.com/permalink_6',
    'https://www.youtube.com/permalink_7',
    'https://www.youtube.com/permalink_8',
    'https://www.youtube.com/permalink_9',
    'https://www.youtube.com/permalink_10',
    'https://www.youtube.com/permalink_11',
    'https://www.youtube.com/permalink_12',
    'https://www.youtube.com/permalink_13',
    'https://www.youtube.com/permalink_14'
]

channel_name = [
    "X_1",
    "X_2",
    "X_3",
    "X_4",
    "X_5",
    "X_6",
    "X_7",
    "X_8",
    "X_9",
    "X_10",
    "X_11",
    "X_12",
    "X_13",
    "X_14"
]

# 把浏览器初始化移到循环外,避免重复启动关闭
PATH = 'C:\\webdrivers\\chromedriver.exe'
driver = webdriver.Chrome(PATH)
driver.implicitly_wait(10)

for url, name in zip(urls, channel_name):
    driver.get(url)

    # 滚动加载视频列表
    for i in range(30):
        driver.find_element(By.TAG_NAME, "Body").send_keys(Keys.END)
        time.sleep(2)  # 用sleep替代重复设置implicitly_wait,更稳定

    time.sleep(5)

    vid_title = []
    viewers = []
    posted_date = []

    titles = driver.find_elements(By.XPATH, "//a[@id='video-title']")
    views = driver.find_elements(By.XPATH, "//div[@id='metadata-line']/span[1]")
    when = driver.find_elements(By.XPATH, "//div[@id='metadata-line']/span[2]")

    for title in titles:
        vid_title.append(title.text)
    for view in views:
        viewers.append(view.text)
    for posted in when:
        posted_date.append(posted.text)

    vid_item = {
        "video_title" : vid_title,
        "views" : viewers,
        "date_posted" : posted_date
    }

    df = pd.DataFrame(vid_item, columns=["video_title", "views", "date_posted"])
    print(df)
    
    # 用f-string格式化文件名,替换成你的实际保存路径
    df.to_csv(rf"C:\Users\........\IG_{name}.csv", sep=",", index=False)  # 加上index=False避免保存索引列

# 循环结束后关闭浏览器
driver.quit()

关键修改点说明

  1. 遍历方式修改:将for url in urls:改为for url, name in zip(urls, channel_name):,这样每次循环能同时获取当前频道的URL和对应的名称。
  2. CSV命名格式化:使用rf"C:\Users\........\IG_{name}.csv"(r表示原始字符串,f表示格式化字符串),把name变量代入文件名,实现每个频道对应独立命名的CSV。
  3. 代码优化:
    • 把浏览器初始化移到循环外部,减少重复启动关闭浏览器的开销,避免残留进程。
    • 移除循环内重复设置的driver.implicitly_wait(),隐式等待只需设置一次即可,重复设置不会叠加效果。
    • 滚动加载时用time.sleep(2)替代implicitly_wait,滚动后等待页面加载更稳定。
    • 保存CSV时加上index=False,避免把DataFrame的索引列也保存到CSV里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:36:23