How to get comments from videos using YouTube API v3 and Python?

前端 未结 5 1965
陌清茗
陌清茗 2021-02-02 04:40

I\'ve been trying to get comments (both threads and replies) from a given video on YouTube using Python (as an exercise to learn the language).

Based on the examples giv

相关标签:
5条回答
  • 2021-02-02 04:44

    it seems you are dealing with the same problem i had. Comments your are missing most proabably are hidden behind a comment Thread. Simple solution, after you getting all comment threads id, take each comment thread id and check whether it has hidden comments, if so scrape them. Here is the simple example:

    if (item['snippet']['totalReplyCount']>0):
                res2 = comments_list(youtube, 'snippet', item['id'])
                for item2 in res2['items']:
                    commentL = list()
                    commentL.append(item2['id'])
                    commentL.append(item2['snippet']['authorChannelUrl'])
    
    def comments_list(service, part, parent_id):
        results = service.comments().list(
        parentId=parent_id,
        part=part
      ).execute()
    
        return results 
    
    0 讨论(0)
  • 2021-02-02 04:49

    Im using this code

    import os
    import pickle
    import google.oauth2.credentials
    from googleapiclient.discovery import build
    from googleapiclient.errors import HttpError
    from google_auth_oauthlib.flow import InstalledAppFlow
    from google.auth.transport.requests import Request
    
    CLIENT_SECRETS_FILE = "client_secret.json" # for more information  to create your credentials json please visit https://python.gotrained.com/youtube-api-extracting-comments/
    SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']
    API_SERVICE_NAME = 'youtube'
    API_VERSION = 'v3'
    
    def get_authenticated_service():
        credentials = None
        if os.path.exists('token.pickle'):
            with open('token.pickle', 'rb') as token:
                credentials = pickle.load(token)
        #  Check if the credentials are invalid or do not exist
        if not credentials or not credentials.valid:
            # Check if the credentials have expired
            if credentials and credentials.expired and credentials.refresh_token:
                credentials.refresh(Request())
            else:
                flow = InstalledAppFlow.from_client_secrets_file(
                    CLIENT_SECRETS_FILE, SCOPES)
                credentials = flow.run_console()
    
            # Save the credentials for the next run
            with open('token.pickle', 'wb') as token:
                pickle.dump(credentials, token)
    
        return build(API_SERVICE_NAME, API_VERSION, credentials = credentials)
    
    def get_video_comments(service, **kwargs):
        comments = []
        results = service.commentThreads().list(**kwargs).execute()
        while results:
            for item in results['items']:
                comment = item['snippet']['topLevelComment']['snippet']['textDisplay']
                comments.append(comment)
            # Check if another page exists
            if 'nextPageToken' in results:
                kwargs['pageToken'] = results['nextPageToken']
                results = service.commentThreads().list(**kwargs).execute()
            else:
                break
    
        return comments
    
    
    if __name__ == '__main__':
        # When running locally, disable OAuthlib's HTTPs verification. When
        # running in production *do not* leave this option enabled.
        os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1'
        service = get_authenticated_service()
        videoId = input('Enter Video id : ') # video id here (the video id of https://www.youtube.com/watch?v=vedLpKXzZqE -> is vedLpKXzZqE)
        comments = get_video_comments(service, part='snippet', videoId=videoId, textFormat='plainText')
    
    print(len(comments),comments)
    

    good luck

    0 讨论(0)
  • 2021-02-02 05:00

    In the latest version of the API, you can only get replies to top level comments. Further replies that are not replying to the top level comments can't be fetched. Source - https://developers.google.com/youtube/v3/docs/comments/list

    This contributes to a significant reduction in the number of comments.

    0 讨论(0)
  • 2021-02-02 05:03

    I don't know if it's the same root cause, but I ran into trouble recently when I was trying to access all comments of a video. I would get a list of comment threads, but when I tried to find all the replies to those comments: some comments would show up and some wouldn't. I noticed, however, that the API query you can try out in the documentation would usually seem to retrieve more results than attempts I made in my own code. I checked the Network panel and noticed that the example in the API documentation is making calls to https://content.googleapis.com - not https://www.googleapis.com as it instructs others to do. I had better luck using the content URL instead, but I'm not sure why there is such a discrepancy between the two.

    0 讨论(0)
  • 2021-02-02 05:08

    You can fetch all the comments using the nextPageToken. YouTube v3 API has gone something messy. But don't worry, i think this is something you are looking for.

    YOUTUBE_COMMENT_URL = 'https://www.googleapis.com/youtube/v3/commentThreads'
    def get_video_comment(self):
    
        def load_comments(self):
            for item in mat["items"]:
                comment = item["snippet"]["topLevelComment"]
                author = comment["snippet"]["authorDisplayName"]
                text = comment["snippet"]["textDisplay"]
                print("Comment by {}: {}".format(author, text))
                if 'replies' in item.keys():
                    for reply in item['replies']['comments']:
                        rauthor = reply['snippet']['authorDisplayName']
                        rtext = reply["snippet"]["textDisplay"]
    
                    print("\n\tReply by {}: {}".format(rauthor, rtext), "\n")
    
        parser = argparse.ArgumentParser()
        mxRes = 20
        vid = str()
        parser.add_argument("--c", help="calls comment function by keyword function", action='store_true')
        parser.add_argument("--max", help="number of comments to return")
        parser.add_argument("--videourl", help="Required URL for which comments to return")
        parser.add_argument("--key", help="Required API key")
    
        args = parser.parse_args()
    
        if not args.max:
            args.max = mxRes
    
        if not args.videourl:
            exit("Please specify video URL using the --videourl=parameter.")
    
        if not args.key:
            exit("Please specify API key using the --key=parameter.")
    
        try:
            video_id = urlparse(str(args.videourl))
            q = parse_qs(video_id.query)
            vid = q["v"][0]
    
        except:
            print("Invalid YouTube URL")
    
        parms = {
                    'part': 'snippet,replies',
                    'maxResults': args.max,
                    'videoId': vid,
                    'key': args.key
                }
    
        try:
    
            matches = self.openURL(YOUTUBE_COMMENT_URL, parms)
            i = 2
            mat = json.loads(matches)
            nextPageToken = mat.get("nextPageToken")
            print("\nPage : 1")
            print("------------------------------------------------------------------")
            load_comments(self)
    
            while nextPageToken:
                parms.update({'pageToken': nextPageToken})
                matches = self.openURL(YOUTUBE_COMMENT_URL, parms)
                mat = json.loads(matches)
                nextPageToken = mat.get("nextPageToken")
                print("\nPage : ", i)
                print("------------------------------------------------------------------")
    
                load_comments(self)
    
                i += 1
        except KeyboardInterrupt:
            print("User Aborted the Operation")
    
        except:
            print("Cannot Open URL or Fetch comments at a moment")
    

    Find the full source code for other utilites at GitHub

    This script can fetch comments (along with replies), perform search and return videos, channels and playlist in categorized form and also returns country based search results.

    Hope this helps.

    0 讨论(0)
提交回复
热议问题