首页 > 解决方案 > 在 python 中使用 youtube API 3 抓取频道中存在的多个视频数据

问题描述

我正在尝试抓取youtube 频道的视频数据。为此,我抓取了一个特定频道中存在的所有视频网址。

随着这些视频 Url 尝试使用 youtube API 3 获取每个视频的数据。

我已将所有视频 URL 存储在一个列表中,并将列表传递给函数以抓取有关视频的数据。

我试图循环所有的 Url,我只得到一条记录。在视频 ID 列中,我将所有 ID 放在数组内的一行中。

请让我知道我哪里出错了。

from apiclient.discovery import build
import argparse
import csv
import unidecode

DEVELOPER_KEY = "XXXXX"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

class Something:

    def youtube_video(self,video_id):

        global video_result

        youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, developerKey=DEVELOPER_KEY)

        videos = []
        channels = []
        playlists = []
        videoresult = []
        
        #video_id = len(video_id)

        for ids in range(0,len(video_id)):
            video_sample = youtube.videos().list(id=video_id[ids],part="id,snippet").execute()

            #print(video_sample)


            csvFile = open('youtube_video_data_testing1.csv','w')
            csvWriter = csv.writer(csvFile)
            csvWriter.writerow(["title","videoId","viewCount","likeCount","dislikeCount", "commentCount","favoriteCount"])


            for search_result in video_sample.get("items", []):
                if search_result["kind"] == "youtube#video":

                    title = search_result["snippet"]["title"]
                    title = unidecode.unidecode(title)
                    #ids = search_result["id"]
                    video_response = youtube.videos().list(id=video_id[ids],part="statistics").execute()
                    #print(video_response)
                    #video_id.append(ids)

                    for video_result in video_response.get("items",[]):
                            viewCount = video_result["statistics"]["viewCount"]
                            if 'likeCount' not in video_result["statistics"]:
                                    likeCount = 0
                            else:
                                    likeCount = video_result["statistics"]["likeCount"]
                            if 'dislikeCount' not in video_result["statistics"]:
                                    dislikeCount = 0
                            else:
                                    dislikeCount = video_result["statistics"]["dislikeCount"]
                            if 'commentCount' not in video_result["statistics"]:
                                    commentCount = 0
                            else:
                                    commentCount = video_result["statistics"]["commentCount"]
                            if 'favoriteCount' not in video_result["statistics"]:
                                    favoriteCount = 0
                            else:
                                    favoriteCount = video_result["statistics"]["favoriteCount"]


                    nextPageToken = video_result.get('nextPageToken')
                    while ('nextPageToken' in video_result):
                        nextPage = youtube.videos().list(id=video_id[ids],part="statistics").execute()
                        video_result['items'] = video_result['items'] + nextPage['items']

                    if 'nextPageToken' not in video_result:
                        video_result.pop('nextPageToken', None)
                    else:
                        nextPageToken = video_result['nextPageToken']

                    #videoresult.append(video_result)

                    csvWriter.writerow([title,video_id,viewCount,likeCount,dislikeCount, commentCount,favoriteCount])

            #csvFile.close()

                    return video_result

s = Something()
s.youtube_video(data)

我正在为一条记录获得这样的输出。

 title,videoId,viewCount,likeCount,dislikeCount,commentCount,favoriteCount

 How to make video marketing work for your business? (Genius Talk Ft.
 Michael Brenner),"['sds0bFbkP9U', 'jHGOtEpKMTg', 'CxkytEeaeoM',
 '7bVblNUuQNU', 'UBQNCokuvsA', 'jkGNEgpwxAw', 'kVt3CtnFD90',
 'zDXX7jA4clg', 'BLD9cMILHCU', 'YPjP7UvRhns', 'E6DDA7PX4qA',
 'L9yYwpowSQE', 'Q5EFZp1Dq30', 'ChxqD72CiL0', 'w6_E2IgSza0',
 'gLrL3rkO5TM', 'MsIu-nIYfds', 'VAr3aV-aFCI', 'WrLnQtqmtaE',
 'xwdBEIammiQ', 'i2PRiIEh-7c', '4E9TmuZZAp4', 'UdKkfuYCAjA',
 'kv6lqSwZJLw', 'S5AfpHHTPVg', 'sGLg0NqAyK0', 'GH5tF063-Og',
 'pDz2ZVp14JU', 'Zn0HQ3kk5mk', 'tvt588IHPSo', '1hvtiFOsb7Y',
 'BKBfBMS9Xuw', 'bIBahCXR10w', 'e0DUIRms_bg', 'VrT7RDh817U',
 'qoqzcYmKn6w', 'sfNC3UaVhNs', 'LbMmS4hLnoo', 'ohwDFePuhlU',
 'VcvkgKElFw0', 'gSMWkdH2rbk', 'cE3hngrYF9I', 'PGoazo0kE9Q',
 'dnWM7Ay67y0', 'fAWRxMhaNsk', 'Q1pEePqeAYc', 'WZs-yZvyhUA',
 'S48cAk_sISs', 'B3uIHj8zxLc', '9OaOo55zbss', 'POtMS7pTR28',
 'Qe1aLETVr9s', 'NWUXJJDukF0', 'NaImKCWyPyU', 'WK-Ou-8dQ4U',
 'm9-RGcr6KN4', '6__glAsOhno', 'rG9Gt_EaN34', 'mXnI2Ojpvyo',
 'EAn-UJZWJY4', 'W-uu717R2gU', 'cnjl7Hl1QF0', 'Oq5SykGHsrA',
 'lpEoiSQVwM4', '_W-f0GOde8Q', 'wLlzgCMJfmw', 'ofNY5Z2zfZc',
 'zHq0S274s1U', 'zVBDHEvyMFs', 'E1-GoEMOm4U', 'HqKJC4267Dc',
 'lYHvaGOJ4jw', 'l8w60VYS0J0', 'Tl-WSyRK7lI', 'DxtL8u2zgqg',
 'OgrurImBf54', 'GLe-k-ct8eA', 'INrHlrSqioU', 'ZmKnf8Ya3jU',
 'afAppKJHBr0', 'kIvdH5mCHeE', 'xlZL_sJGQ5I', '8S8Kon7JsmA',
 'AfM1_jMoBlE', 'FGMzszYrHGI', 'v5rBe6nYyeQ', 'XPnXdn1r724',
 'yQ3ZitZun8s', 'kzLMD5RXBew', 'SPFfYlAMvuI', 'VZDbslni3DQ',
 'Hv397JnNWYc', 'qy7xbEguv8U', 'BGCOfz8M0bQ', 'L1bd16AwvMg',
 'mPrydY0mpfQ', '-V028-D0GkQ', 'hlYsJJAZm7k', '8TGa_RdxegU',
 'HSENz13ZFxo', 'WqwqzJKa7u0', 'l9YVD0bZ4Io', '5fLZXZgsByo',
 'j-4zwpMUsCY', 'PXSXWjfSqY4', 'YUgmIX9V91M', 'fligYEdU34Q',
 'WMtfbEMgxlU', 'fU4Kx1emu9E', 'OwcMbm7qPAQ', 'FAEUCz9Wt2k',
 '00Hn4RKvEhI', 'wrzsudecHQ0', '4aXffNV-UHs', '3ceG3y224VU',
 '1i8KpWev-Ug', 'buvZWcik9hE', '0o4fFgBdQqQ', 'GwQK_fuXU1w',
 'LCbKy0PC9SY', '48rbra_J6W0', 'nS2pPRzb4lg', 'D-2Voa3XmTU',
 'rsxP3FI8kq8', 'ImTiE7_Qz9M', '9_RwsrgDc0A', 'F0OLsdepsVg',
 '78HvcSgNDAQ', 'vnOJPYHIIXc', 'g_rLw2FoRbg', 'sds0bFbkP9U',
 'sds0bFbkP9U']",83,3,0,2,0

我需要获取我在列表中传递的所有视频的数据。

我的示例列表 - ['sds0bFbkP9U', 'jHGOtEpKMTg', 'CxkytEeaeoM'] 看起来像这样(频道中可用的所有 videoID)

3 条记录的预期输出样本:

 title,videoId,viewCount,likeCount,dislikeCount,commentCount,favoriteCount
    1. How to make video marketing work for your business? (Genius Talk Ft. Michael Brenner),sds0bFbkP9U,83,3,0,2,0
    2. video name 2 , g_rLw2FoRbg, 78,0,9,2
    3. videoname 3 , sds0bFbkP9U,  98,0,23,76

标签: pythonweb-scrapinggoogle-api

解决方案


尝试编写 csv 文件时出现问题。

csv_list = []
filename = 'crashcourse.csv'

with open(filename, 'a') as f:
    writer = csv.writer(f)


    writer.writerow(('title','videoId','viewCount','likeCount','dislikeCount','commentCount','favoriteCount'))

csv_list.append(['title','videoId','viewCount','likeCount','dislikeCount','commentCount','favoriteCount'])
writer.writerow([title,ids,viewCount,likeCount,dislikeCount, commentCount,favoriteCount])

上面的代码对我有用。


推荐阅读