本篇文章开始我们爬取爱奇艺上《青春有你2》下面的评论内容,进行词频统计并可视化,然后制作词云来展示最关心的问题。
本篇文章,我们先来爬取评论数据,并进行预处理,下篇文章我们使用处理好的数据进行词频统计和可视化,以及制作词云。
我们先来看下步骤:
1. 爬取爱奇艺《青春有你2》评论数据,爬取评论条数不能少于1000条
2. 数据预处理:清理清洗评论中的特殊符号及表情符,并保存为txt文档
下面我们就来一步一步实现爬取数据。
1
爬取爱奇艺《青春有你2》评论数据
我们以第22期为例在浏览器打开网址https://www.iqiyi.com/v_19rxwechv0.html,选择第22期下的视频,然后按F12打开调试工具,找到评论位置,发现我们需要去点"查看更多评论"去显示下20条评论,如下图,当点击后,会有个GET请求发出,我们只需需要去构造这个网址,就可以得到所有评论。
网址中?后面的一般都是参数,所以我们只需要用https://sns-comment.iqiyi.com/v3/comment/get_comments.action?这个网址加上需要的参数构造完整的网址就可以了。
爬取评论内容代码:
import requests
import json
import re
# 请求爱奇艺评论接口,返回response信息
def get_movie_info(last_id):
"""
请求爱奇艺评论接口,返回response信息
参数 last_id: 评论翻页
:return: response信息
"""
headers = {
"Host": "sns-comment.iqiyi.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0",
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Referer": "https://www.iqiyi.com/v_19ryfkiv8w.html",
"DNT": "1"
}
# content_id:视频ID
# last_id:控制评论翻页
url = "https://sns-comment.iqiyi.com/v3/comment/get_comments.action?"
params = {
"agent_type": "118",
"agent_version": "9.11.5",
"authcookie": "null",
"business_type": "17",
"content_id": "16361088000",
"hot_size": "0",
"last_id": last_id,
"page": "",
"page_size": "20",
"types": "time"
}
for key, value in params.items():
url = url + key + "=" + value + "&"
r = requests.get(url, headers=headers)
# print(r.text)
if r.status_code == 200:
return r.text
return None
def save_movie_info_to_file(last_id, arr):
"""
解析json数据,获取评论
参数 last_id:最后一条评论ID arr:存放文本的list
:return: 新的last_id
"""
response_text = get_movie_info(last_id)
response_json = json.loads(response_text)
comments = response_json["data"]["comments"]
if comments:
for comment in comments:
if "content" in comment.keys():
arr.append(comment['content'])
last_id = str(comment["id"])
return last_id
2
对评论内容数据清洗,保存为txt文件
我们把上面爬取的评论内容进行清洗,去除特殊字符和表情,保存为content.txt文件
def filter_str(des_str, res_tr=''):
"""
过滤除中英文及数字以外的其他字符
"""
res = re.compile("[^\u4e00-\u9fa5^a-z^A-Z^0-9]")
return res.sub(res_tr, des_str)
def filter_emoji(des_str, res_tr=''):
"""过滤表情"""
try:
res = re.compile(u'[\U00010000-\U0010ffff]')
except re.error:
res = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
return res.sub(res_tr, des_str)
def clear_special_char(arr):
"""
正则处理特殊字符
参数 arr:原文本, list格式
return: 清除后的文本
"""
new_arr = []
for content in arr:
if content:
content = filter_str(content)
content = filter_emoji(content)
# print(content)
with open("content.txt", "a") as f:
f.write(content + "\n")
new_arr.append(content)
return new_arr
3
我们在主函数中实现完整逻辑
if __name__ == "__main__":
org_last_id = "245317717421"
comment_list = []
while org_last_id != "":
new_last_id = save_movie_info_to_file(org_last_id, comment_list)
if new_last_id == org_last_id:
break
org_last_id = new_last_id
# print(comment_list)
# 清洗数据,去除特殊字符和表情符,并保存为txt文档
new_comment_list = clear_special_char(comment_list)
# print(new_comment_list)
至此,我们得到了所有评论信息并保存了下来,看一下我们保存的结果,评论内容保存在content.txt里面
下一篇我们将用这些信息去做一些分析,进行词频统计并可视化展示,制作词云,并利用第三方模块进行内容审核。