【问题标题】:Youtube Data Api Storing Comments URLYoutube 数据 API 存储评论 URL
【发布时间】:2021-04-26 23:53:11
【问题描述】:

我正在尝试通过数据 API 存储 youtube cmets 配置文件 URL。一切正常,但我正在尝试使用 nextPageToken 浏览所有 cmets。我一开始可以为它设置一个值,但它不会改变,代码进入一个无限循环。在循环中打印 pageToken 只会始终给出相同的值。

API_ENDPOINT = 'https://www.googleapis.com/youtube/v3/commentThreads?key=MYKEY&textFormat=plainText&part=snippet&videoId=0DmA_MCIjy8&maxResults=2&order=time'
r = requests.get(url = API_ENDPOINT)
data = r.json()
for items in data['items']:
    store = str(items['snippet']['topLevelComment']['snippet']['authorChannelUrl'])
    channelUrls.append(store)

pageToken = str(data['nextPageToken'])

while pageToken:
    API_ENDPOINT = 'https://www.googleapis.com/youtube/v3/commentThreads?key=MYKEY&textFormat=plainText&part=snippet&videoId=0DmA_MCIjy8&maxResults=2&&pageToken=' + pageToken

    pageToken= str(data['nextPageToken'])
    print(len(channelUrls))
    for items in data['items']:
        store = str(items['snippet']['topLevelComment']['snippet']['authorChannelUrl'])
        channelUrls.append(store)

【问题讨论】:

    标签: python python-3.x youtube youtube-api youtube-data-api


    【解决方案1】:

    您的代码进入无限循环,因为循环 while pageToken: 缺少对 requests.get(url = API_ENDPOINT) 的调用:

    while pageToken:
            API_ENDPOINT = 'https://www.googleapis.com/youtube/v3/commentThreads?key=MYKEY&textFormat=plainText&part=snippet&videoId=0DmA_MCIjy8&maxResults=2&&pageToken=' + pageToken
            r = requests.get(url = API_ENDPOINT)
            data = r.json()
       
            pageToken = data.get('nextPageToken')
            print(len(channelUrls))
            for items in data['items']:
                store = str(items['snippet']['topLevelComment']['snippet']['authorChannelUrl'])
                channelUrls.append(store)
    

    顺便说一句,你最好这样写你的 API 结果集分页:

    API_ENDPOINT = 'https://www.googleapis.com/youtube/v3/commentThreads?key=MYKEY&textFormat=plainText&part=snippet&videoId=0DmA_MCIjy8&maxResults=2&order=time'
    pageToken = None
    channelUrls = []
    
    while True:
        url = API_ENDPOINT
        if pageToken: url += "&pageToken=" + pageToken
        data = requests.get(url = url).json()
        for item in data.get('items', []):
            store = item['snippet']['topLevelComment']['snippet']['authorChannelUrl']
            channelUrls.append(store)
        pageToken = data.get('nextPageToken')
        if not pageToken: break
    

    另请注意,您的API_ENDPOINT URL 很可能包含以下形式的fields 请求参数:

    API_ENDPOINT = '...&fields=nextPageToken,items/snippet/topLevelComment/snippet/authorChannelUrl'
    

    始终向 API 询问实际使用的信息是一种很好的做法。

    【讨论】:

    • 好的,谢谢!,我正在查看您的其他代码,不幸的是,我收到 KeyError: 'nextPageToken'。在最后一页。我认为仅仅因为它在最后一个上不存在“nextPageToken”,你就会得到那个错误?
    【解决方案2】:

    您似乎错过了 while 循环中对 requests.get 的调用。

    试试这个:

    API_ENDPOINT = 'https://www.googleapis.com/youtube/v3/commentThreads?key=MYKEY&textFormat=plainText&part=snippet&videoId=0DmA_MCIjy8&maxResults=2&order=time'
    r = requests.get(url = API_ENDPOINT)
    data = r.json()
    for items in data['items']:
        store = str(items['snippet']['topLevelComment']['snippet']['authorChannelUrl'])
        channelUrls.append(store)
    
    pageToken = str(data['nextPageToken'])
    
    while pageToken:
        API_ENDPOINT = 'https://www.googleapis.com/youtube/v3/commentThreads?key=MYKEY&textFormat=plainText&part=snippet&videoId=0DmA_MCIjy8&maxResults=2&&pageToken=' + pageToken
    
        r = requests.get(url = API_ENDPOINT)
        data = r.json()
        pageToken= str(data['nextPageToken'])
        print(len(channelUrls))
        for items in data['items']:
            store = str(items['snippet']['topLevelComment']['snippet']['authorChannelUrl'])
            channelUrls.append(store)
    

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 2020-06-27
      • 2013-09-20
      • 2013-11-21
      • 1970-01-01
      • 2022-01-05
      • 2015-07-10
      • 1970-01-01
      • 2010-12-03
      相关资源
      最近更新 更多