Obtención del número de comentarios de una lista de videos de youtube.

He estado codificando un simple script en Python para obtener el número de vistas y el número de comentarios de una lista de videos. Usando csv, he convertido una tabla separada por tabuladores en una lista de listas, y luego traté de obtener ambos elementos. Al inspeccionar el número de vistas, el elemento es "div", {"class":"watch-view-count"} . Funciona según lo previsto

 r = requests.get(list_youtube_reading[n][0]) # it retrieves each video URL from a csv soup = BeautifulSoup(r.text) for element in soup.findAll("div", {"class":"watch-view-count"}): patternviews = re.compile('^(.*?) .*') scissorviews = patternviews.match(element.text.encode("utf-8")) views = re.sub('\.','', tijeraviews.group(1)) 

Sin embargo, el elemento para el número de comentarios es

Comments " • 6"

Cuando intenté conseguirlo, con

 for element in soup.findAll("h2", {"class":"comment-section-header-renderer"}): comments = element.text.encode("utf-8") print comments 

no pasa nada, y en realidad la soup no contiene ninguna etiqueta

¿Qué puedo hacer para recuperar el número de comentarios? Traté de usar la API de datos de YouTube v3, pero sin resultado

gracias por adelantado

Una forma sencilla sería utilizar Selenium WebDriver para simular un navegador web. He observado que cuando nos desplazamos hacia abajo, solo entonces YouTube carga la sección de comentarios. Así que mi solución es hacer que el controlador web se desplace hacia abajo y espere hasta que se encuentre el elemento deseado. Una vez que se ha localizado, la siguiente secuencia de comandos lo toma y obtiene el valor.

Para usar Selenium, necesitamos descargar uno de los controladores de terceros desde esta página . He utilizado el Mozilla GeckoDriver. Y también necesitamos poner la ruta de acceso a este archivo ejecutable en las variables de entorno del sistema. Como estoy en una máquina de Ubuntu, puse el archivo descargado (después de extraerlo) en /usr/local/bin/ y no necesitaba nada más. Después de configurar la ruta correctamente, podemos ejecutar el siguiente script para obtener los valores deseados. Y también necesitamos instalar el propio Selenium. Las instrucciones están aquí .

 # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By video_url = 'https://www.youtube.com/watch?v=NP189MPfR7Q' driver = webdriver.Firefox() driver.set_page_load_timeout(30) driver.get(video_url) driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") for view_num in driver.find_elements_by_class_name("watch-view-count"): print 'Number of views: ' + view_num.text.replace(' views', '') try: element = WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.CLASS_NAME, "comment-section-header-renderer"))) for comment_num in driver.find_elements_by_class_name("comment-section-header-renderer"): print u'Number of comments: ' + comment_num.text.replace(u'COMMENTS • ', '') finally: driver.quit() 

Salida:

 Number of views: 3,555 Number of comments: 3 

NOTA Dado que el elemento DOM (que contiene el recuento de comentarios) tiene algún carácter NO ASCII en su interior, tuve que colocar la primera línea del script.

Y si no te gusta que Selenium muestre la GUI, sigue estas instrucciones . No hice esto pero las instrucciones deberían ser suficientes.

Parece que la sección de comentarios se carga en una solicitud de ajax por separado a una URL como esta:

https://www.youtube.com/watch_fragments2_ajax?v=zlYDDLCorNw&tr=time&distiller=1&ctoken=EhYSC3psWURETENvck53wAEAyAEA4AEBGAY%253D&frags=comments&spf=load

Eso devuelve un json así:

 { "name": "other", "foot": "", "body": { "watch-discussion": " ... 

\nComments • 2 ..." } }

En ese json es donde encontrará la sección HTML que muestra el recuento de comentarios (en body.watch-Discussion).