希望从给定视频中获取所有评论,而不是一次浏览一页。
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]
上面的代码可让您获取单个评论,可能是最近的评论,但我正在寻找一种一次抓取所有评论的方法。这在Python的gdata
模块中可能吗?
用于评论的 Youtube API 文档、评论源文档和 Python API 文档
以下内容实现了您使用Python YouTube API所要求的内容:
from gdata.youtube import service
USERNAME = 'username@gmail.com'
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))
遗憾的是,API 将可检索的条目数限制为 1000。这是我尝试使用手工制作的 GetYouTubeVideoCommentFeed
URL 参数调整版本时遇到的错误:
gdata.service.RequestError: {'status': 400, 'body': 'You cannot request beyond item 1000.', 'reason': 'Bad Request'}
请注意,相同的原则应适用于检索 API 的其他源中的条目。
如果要手动制作 GetYouTubeVideoCommentFeed
URL 参数,其格式为:
'https://gdata.youtube.com/feeds/api/videos/{video_id}/comments?start-index={start_index}&max-results={max_results}'
以下限制适用:start-index <= 1000
和max-results <= 50
。
我现在唯一的解决方案,但它不使用 API,当有数千条评论时会变慢。
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)
请注意,由于"class"是一个内置的python名称,因此您无法通过正则表达式或lambdas进行常规搜索"startwith",如下所示,因为您使用的是字典,而不是常规参数。由于BeautifulSoup,它也变得非常慢,但是由于etree
和minidom
由于某种原因找不到匹配的标签,因此需要使用它。即使在与bs4
prettyfying()
之后