使用Python分析YouTube评论--参数已禁用评论



我正在尝试使用YouTube评论进行文本分析。我一直在使用以下网站上的代码来抓取YouTube:

https://www.pingshiuanchua.com/blog/post/using-youtube-api-to-analyse-youtube-comments-on-python

脚本开始工作,但如果评论被禁用,代码中有一部分会生成错误,我找不到检查评论是否被禁用或是否存在评论的方法,如果没有评论可以抓取,则跳过该视频,继续下一个视频。

产生错误的代码块是:

# =============================================================================
# Get Comments of Top Videos
# =============================================================================
video_id_pop = []
channel_pop = []
video_title_pop = []
video_desc_pop = []
comments_pop = []
comment_id_pop = []
reply_count_pop = []
like_count_pop = []
from tqdm import tqdm
for i, video in enumerate(tqdm(video_id, ncols = 100)):
response = service.commentThreads().list(
part = 'snippet',
videoId = video,
maxResults = 100, # Only take top 100 comments...
order = 'relevance', #... ranked on relevance
textFormat = 'plainText',
).execute()

comments_temp = []
comment_id_temp = []
reply_count_temp = []
like_count_temp = []
for item in response['items']:
comments_temp.append(item['snippet']['topLevelComment']['snippet']['textDisplay'])
comment_id_temp.append(item['snippet']['topLevelComment']['id'])
reply_count_temp.append(item['snippet']['totalReplyCount'])
like_count_temp.append(item['snippet']['topLevelComment']['snippet']['likeCount'])
comments_pop.extend(comments_temp)
comment_id_pop.extend(comment_id_temp)
reply_count_pop.extend(reply_count_temp)
like_count_pop.extend(like_count_temp)

video_id_pop.extend([video_id[i]]*len(comments_temp))
channel_pop.extend([channel[i]]*len(comments_temp))
video_title_pop.extend([video_title[i]]*len(comments_temp))
video_desc_pop.extend([video_desc[i]]*len(comments_temp))

query_pop = [query] * len(video_id_pop)

编辑后添加:

创建代码的人留下了一条消息来修复错误,说:

"您可以在try…中包装代码的查询部分。。。except语句,其中如果try语句(查询部分(失败,则可以推送except-of blank响应或";错误";字符串添加到列表中">

如果对其他人有意义,我有NFI如何执行。。。

注意:这不一定是"好";编码风格,但如果我在为自己的短期个人用途编写脚本时遇到这个问题,我会这么做。

Python(和许多其他语言(有一种方法可以捕获异常并在不崩溃的情况下处理它们。如果使用得当,这可能是处理坏数据的一种非常好的方法。

https://docs.python.org/3.8/tutorial/errors.html是一个很好的例外概述。一般来说,他们采用的格式有点像

try:
code_that_can_error()
except ExceptionThatWIllBeThrown as ex:
handle_exception()
print(ex) # ex is an object that has information about what went wrong
finally:
clean_up()

(如果你有需要调用关闭的东西,比如文件,那么Finally特别有用。如果抛出异常,你可能不会关闭它,但即使抛出异常,也保证会调用Finally。(

在您的情况下,我们所需要的只是忽略错误并继续观看下一个视频。

for i, video in enumerate(tqdm(video_id, ncols = 100)):
try:
response = service.commentThreads().list(
part = 'snippet',
videoId = video,
maxResults = 100, # Only take top 100 comments...
order = 'relevance', #... ranked on relevance
textFormat = 'plainText',
).execute()

comments_temp = []
[...]
video_desc_pop.extend([video_desc[i]]*len(comments_temp))
except:
# Something threw an error. Skip that video and move on
print(f"{video} has comments disabled, or something else went wrong")
query_pop = [query] * len(video_id_pop)

最新更新