2012-10-10 20 views
5

Buscando captar todos los comentarios de un video determinado, en lugar de ir de página en página.¿Cómo obtener todos los comentarios de YouTube con el módulo gdata de Python?

from gdata import youtube as yt 
from gdata.youtube import service as yts 

client = yts.YouTubeService() 
client.ClientLogin(username, pwd) #the pwd might need to be application specific fyi 

comments = client.GetYouTubeVideoComments(video_id='the_id') 
a_comment = comments.entry[0] 

El código anterior con le permiten agarrar un solo comentario, probablemente el comentario más reciente, pero estoy buscando una manera de agarrar todos los comentarios a la vez. ¿Es esto posible con el módulo gdata de Python?


Los documentos de la API de Youtube para comments, la fuente de comentarios docs y la API de Python docs

+0

Esto fue respondido [aquí] (http://stackoverflow.com/questions/10941803/using-youtube-api-to-get-all-comments-from-a-video-with-the-json-feed) con una solución que utiliza PHP, ya que la API PHP de YouTube tiene una llamada que lo permite. No creo que haya una respuesta pura de Python. –

+0

@KenB Lo vi también. Es una pena. El video en cuestión tiene 9k comentarios y no creo que hacer las llamadas 360 'GetNextLink' sea la mejor manera. – TankorSmash

+1

La URL 'www.youtube.com/all_comments? V = video_id' tiene una lista de comentarios analizables, pero es un tiempo de carga largo. Supongamos que puedo intentar eso. – TankorSmash

Respuesta

7

A continuación se logra lo que solicitó el uso de la Python YouTube API:

from gdata.youtube import service 

USERNAME = '[email protected]' 
PASSWORD = 'a_very_long_password' 
VIDEO_ID = 'wf_IIbT8HGk' 

def comments_generator(client, video_id): 
    comment_feed = client.GetYouTubeVideoCommentFeed(video_id=video_id) 
    while comment_feed is not None: 
     for comment in comment_feed.entry: 
      yield comment 
     next_link = comment_feed.GetNextLink() 
     if next_link is None: 
      comment_feed = None 
     else: 
      comment_feed = client.GetYouTubeVideoCommentFeed(next_link.href) 

client = service.YouTubeService() 
client.ClientLogin(USERNAME, PASSWORD) 

for comment in comments_generator(client, VIDEO_ID): 
    author_name = comment.author[0].name.text 
    text = comment.content.text 
    print("{}: {}".format(author_name, text)) 

Por desgracia, la API limita el número de entradas que se pueden recuperar a . Este fue el error que tuve cuando probé una versión modificada con una mano hecha a mano GetYouTubeVideoCommentFeed parámetro URL:

gdata.service.RequestError: {'status': 400, 'body': 'You cannot request beyond item 1000.', 'reason': 'Bad Request'} 

Tenga en cuenta que el mismo principio debe aplicarse para recuperar las entradas de otros alimentos de la API.

Si desea arte de la mano del parámetro GetYouTubeVideoCommentFeed URL, su formato es: se aplican

'https://gdata.youtube.com/feeds/api/videos/{video_id}/comments?start-index={sta‌​rt_index}&max-results={max_results}' 

las siguientes restricciones: start-index <= 1000 y max-results <= 50.

+1

Excelente. ¿Sabes si hay una manera de configurar manualmente el 'start_index' o' items_per_page'? Establecerlo en el primer conjunto de comentarios no parece hacer nada. – TankorSmash

+1

Solo tiene que pasar una URL con el siguiente formato a 'GetYouTubeVideoCommentFeed':' https://gdata.youtube.com/feeds/api/videos/{video_id}/comments?start-index={start_index}&max-results = {max_results} '. Se aplican las siguientes restricciones: 'start-index <= 1000' y 'max-results <= 50'. –

+0

Genial, ni siquiera pensé en alterar el URI, ¡salud! – TankorSmash

1

La única solución que tengo por ahora, pero no es el uso de la API y se pone lento cuando hay varios miles comentarios

import bs4, re, urllib2 
#grab the page source for vide 
data = urllib2.urlopen(r'http://www.youtube.com/all_comments?v=video_id') #example XhFtHW4YB7M 
#pull out comments 
soup = bs4.BeautifulSoup(data) 
cmnts = soup.findAll(attrs={'class': 'comment yt-tile-default'}) 
#do something with them, ie count them 
print len(cmnts) 

Tenga en cuenta que debido a la 'clase' es un nombre pitón orden interna, no se puede hacer búsquedas regulares para 'startwith' a través de expresiones regulares o lambdas como se ve here, ya que usted está usando un diccionario, sobre los parámetros regulares . También se vuelve bastante lento debido a BeautifulSoup, pero necesita ser usado porque etree y minidom no encuentran etiquetas que coincidan por algún motivo. Incluso después de prettyfying() con bs4

+0

Hola, respuesta de interés, pero creo que la estructura html ha cambiado. ¿Utiliza una etiqueta alternativa en lugar de 'comment yt-tile-default'? ¡Gracias! – Thoth

+0

@Thoth No he usado esto desde hace tiempo, pero abra las herramientas de desarrollo y edite mi respuesta si averigua – TankorSmash

Cuestiones relacionadas