我一直在编写一个简单的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,但无济于事
提前致谢
答案 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中)。