获取YouTube视频列表的评论数量

时间:2017-07-07 15:42:41

标签: python web-scraping youtube beautifulsoup

我一直在编写一个简单的python脚本,用于获取视频数量和视频列表的注释数量。使用csv,我已将一个以制表符分隔的表转换为列表列表,然后我尝试获取这两个元素。检查视图数量,元素为"div", {"class":"watch-view-count"}。它按预期工作

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))

但是,评论数量的元素是     <h2 class="comment-section-header-renderer" tabindex="0">     <b>Comments</b>     " • 6"     <span class="alternate-content-link"></span>
    </h2>

当我尝试使用

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

没有任何反应,实际上soup不包含任何<h2 class="comment-section-header-renderer" tabindex="0">标记

我可以做些什么来检索评论数量?我尝试使用youtube v3数据API,但无济于事

提前致谢

2 个答案:

答案 0 :(得分:3)

一种简单的方法是使用Selenium WebDriver来模拟Web浏览器。我观察到,当我们向下滚动时,YouTube才会加载评论部分。所以我的解决方案是让web驱动程序向下滚动并等到找到所需的元素。找到它之后,下面的脚本会抓取它并获取值。

要使用Selenium,我们需要从this page下载其中一个第三方驱动程序。我使用过Mozilla GeckoDriver。而且我们还需要将这个可执行文件的路径放在系统环境变量中。当我在Ubuntu机器上时,我将下载的文件(在解压缩之后)放在/usr/local/bin/中,我不需要任何其他内容。正确设置路径后,我们可以运行以下脚本来获取所需的值。 而且我们也需要安装Selenium本身。说明为here

# -*- 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()

输出:

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

注意 由于DOM元素(包含注释计数)内部有一些非ASCII字符,我需要放置脚本的第一行。

如果您不希望Selenium显示GUI,请按these instructions。我没有这样做,但说明应该足够了。

答案 1 :(得分:1)

看来评论部分是在一个单独的ajax请求中加载到这样的URL:

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

这会返回一些像这样的json:

{
  "name": "other",
  "foot": "<script>...</script>",
  "body": {
    "watch-discussion": " ... <h2 class=\"comment-section-header-renderer\" tabindex=\"0\">\n<b>Comments</b> • 2<span class=\"alternate-content-link\"> ..."
  }
}

在json中,您可以找到显示评论计数的HTML部分(在body.watch-discussion中)。