2012-04-04 8 views
1

Ich benutze YouTube API mit Python. Ich kann bereits alle Kommentare eines bestimmten Videos sammeln, einschließlich des Namens der Autoren, des Datums und des Inhalts der Kommentare.
Ich kann auch mit einem separaten Stück Code, die persönlichen Informationen (Alter, Geschlecht, Interessen, ...) eines bestimmten Autors extrahieren. Aber ich kann sie nicht an einem Ort verwenden. d. h. ich muss alle Kommentare eines Videos zusammentragen, mit dem Namen der Autoren der Kommentare und mit den persönlichen Informationen all dieser Autoren. in Folge ist der Code, den ich entwickelt habe. Aber ich bekomme einen RequestError, mit dem ich nicht umgehen kann und wo das Problem liegt.Wie sammle ich persönliche Informationen (Alter, Geschlecht ..) aller Autoren der Kommentare zu einem bestimmten Video mit Python YouTube API

import gdata.youtube 
import gdata.youtube.service 

yt_service = gdata.youtube.service.YouTubeService() 
f = open('test1.csv','w') 
f.writelines(['UserName',',','Age',',','Date',',','Comment','\n']) 

def GetAndPrintVideoFeed(string1): 

     yt_service = gdata.youtube.service.YouTubeService() 
     user_entry = yt_service.GetYouTubeUserEntry(username = string1) 
     X = PrintentryEntry(user_entry) 
     return X 

def PrintentryEntry(entry): 

     # print required fields where we know there will be information 
     Y = entry.age.text 
     return Y 

def GetComment(next1): 

     yt_service = gdata.youtube.service.YouTubeService() 
     nextPageFeed = yt_service.GetYouTubeVideoCommentFeed(next1) 

     for comment_entry in nextPageFeed.entry: 

      string1 = comment_entry.author[0].name.text.split("/")[-1] 
      Z = GetAndPrintVideoFeed(string1) 
      string2 = comment_entry.updated.text.split("/")[-1] 
      string3 = comment_entry.content.text.split("/")[-1] 

      f.writelines([str(string1),',',Z,',',string2,',',string3,'\n']) 

     next2 = nextPageFeed.GetNextLink().href 
     GetComment(next2) 

video_id = '8wxOVn99FTE' 
comment_feed = yt_service.GetYouTubeVideoCommentFeed(video_id=video_id) 

for comment_entry in comment_feed.entry: 

     string1 = comment_entry.author[0].name.text.split("/")[-1] 
     Z = GetAndPrintVideoFeed(string1) 
     string2 = comment_entry.updated.text.split("/")[-1] 
     string3 = comment_entry.content.text.split("/")[-1] 

     f.writelines([str(string1),',',Z,',',string2,',',string3,'\n']) 

next1 = comment_feed.GetNextLink().href 
GetComment(next1) 

Antwort

1

Ich denke, dass Sie ein besseres Verständnis der Youtube API benötigen und wie alles miteinander in Beziehung steht. Ich habe Wrapper-Klassen geschrieben, die mehrere Arten von Feeds oder Entries behandeln können und gdatas inkonsistente Parameterkonventionen "behebt".

Hier sind einige Schnipsel, die zeigen, wie das Scrapen/Crawlen ohne allzu große Schwierigkeiten verallgemeinert werden kann.

Ich weiß, dass dies nicht direkt Ihre Frage beantwortet, es ist mehr High-Level-Design, aber es lohnt sich darüber nachzudenken, wenn Sie eine große Menge von youtube/gdata Daten ziehen werden.

def get_feed(thing=None, feed_type=api.GetYouTubeUserFeed): 

    if feed_type == 'user': 
     feed = api.GetYouTubeUserFeed(username=thing) 

    if feed_type == 'related': 
     feed = api.GetYouTubeRelatedFeed(video_id=thing) 

    if feed_type == 'comments': 
     feed = api.GetYouTubeVideoCommentFeed(video_id=thing) 

    feeds = [] 
    entries = [] 

    while feed: 
     feeds.append(feed) 
     feed = api.GetNext(feed) 

    [entries.extend(f.entry) for f in feeds] 

    return entries 

...

def myget(url,service=None): 

    def myconverter(x): 
     logfile = url.replace('/',':')+'.log' 
     logfile = logfile[len('http://gdata.youtube.com/feeds/api/'):] 
     my_logger.info("myget: %s" % url) 

     if service == 'user_feed': 
      return gdata.youtube.YouTubeUserFeedFromString(x) 

     if service == 'comment_feed': 
      return gdata.youtube.YouTubeVideoCommentFeedFromString(x) 

     if service == 'comment_entry': 
      return gdata.youtube.YouTubeVideoCommentEntryFromString(x) 

     if service == 'video_feed': 
      return gdata.youtube.YouTubeVideoFeedFromString(x) 

     if service == 'video_entry': 
      return gdata.youtube.YouTubeVideoEntryFromString(x) 


    return api.GetWithRetries(url, 
      converter=myconverter, 
      num_retries=3, 
      delay=2, 
      backoff=5, 
      logger=my_logger 
      ) 


mapper={} 
mapper[api.GetYouTubeUserFeed]='user_feed' 
mapper[api.GetYouTubeVideoFeed]='video_feed' 
mapper[api.GetYouTubeVideoCommentFeed]='comment_feed' 

https://gist.github.com/2303769 data/service.py (routing)

Verwandte Themen