实战 | 用Python爬取《云南虫谷》3.6万条评论

最近鬼吹灯系列网剧《云南虫谷》上线,作为鬼吹灯系列作品,承接上部《龙岭迷窟》内容,且还是铁三角原班人马主演,网友直呼非常好看!
今天,我们就用爬取目前全部剧集的评论(含预告片),并做数据统计与可视化展示分析,一起跟着网友看看这部剧吧!
本文将详细讲解爬虫与数据处理可视化,寓教于乐!
后台回复 0907领取 代码+数据
目录:
3. 数据统计与可视化展示
1. 网页分析
本次评论全部来自腾讯视频(毕竟独播)
打开《云南虫谷》播放页面,F12进入到开发者模式,我们下滑点击"查看更多评论",可以发现评论的真实请求地址 。
开发者模式
我们找几个评论接口地址进行对比分析,找规律
https://video.coral.qq.com/varticle/7313247714/comment/v2?callback=_varticle7313247714commentv2&orinum=10&oriorder=o&pageflag=1&cursor=6838089132036599025&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1630752996851https://video.coral.qq.com/varticle/7313247714/comment/v2?callback=_varticle7313247714commentv2&orinum=100&oriorder=o&pageflag=1&cursor=6838127093335586287&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1630752996850https://video.coral.qq.com/varticle/7313258351/comment/v2?callback=_varticle7313258351commentv2&orinum=10&oriorder=o&pageflag=1&cursor=6838101562707822837&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1630753165406
最后,我们发现这个地址可以简化成以下部分
url = f'https://video.coral.qq.com/varticle/{comment_id}/comment/v2?'params = {'orinum': 30,'cursor': cursor,'oriorder': 't'}
这其中四个参数含义如下:
刚才提到我们需要获取每集的评论id数据,很巧我们发现请求每集的页面数据就可以获取 。
这里需要注意的是,我们直接用请求每集页面的数据和实际网页端的不太一样,但是相关数据都有,我们可以找找发现 。
比如,剧集的ID列表如下:
剧集的ID列表
剧集的评论id所在位置:
剧集评论id
接着,我们就用re正则表达式进行数据解析即可获取 。
2. 爬虫过程
通过网页分析和我们的采集需求,整个过程可以分为以下几部分:
2.1. 引入需要的库
import requestsimport reimport pandas as pdimport os
2.2. 爬取剧集页面数据
# 用于爬取剧集页面数据def get_html(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36",}r = requests.get(url, headers=headers)# 乱码修正r.encoding = r.apparent_encodingtext = r.text# 去掉非字符数据html = re.sub('\s', '', text)return html
2.3. 解析剧集ID和剧集评论ID
# 传入电视剧等的id,用于爬取剧集id和评论iddef get_comment_ids(video_id):# 剧目地址url = f'https://v.qq.com/x/cover/{video_id}.html'html = get_html(url)data_list = eval(re.findall(r'"vip_ids":(\[.*?\])', html)[0])data_df = pd.DataFrame(data_list)comment_ids = []for tid in data_df.V:# 每集地址url = f'https://v.qq.com/x/cover/{video_id}/{tid}.html'html = get_html(url)comment_id = eval(re.findall(r'"comment_id":"(\d+)"', html)[0])comment_ids.append(comment_id)data_df['comment_id'] = comment_idsdata_df['剧集'] = range(1,len(comment_ids)+1)return data_df
2.4. 采集全部剧集评论
# 获取全部剧集评论def get_comment_content(data_df):for i, comment_id in enumerate(data_df.comment_id):i = i+1# 初始 cursorcursor = 0num = 0while True:url = f'https://video.coral.qq.com/varticle/{comment_id}/comment/v2?'params = {'orinum': 30,'cursor': cursor,'oriorder': 't'}r = requests.get(url, params=params)data = http://www.kingceram.com/post/r.json()data = data['data']if len(data['oriCommList'])==0:break# 评论数据data_content = pd.DataFrame(data['oriCommList'])data_content = data_content[['id', 'targetid', 'parent', 'time', 'userid', 'content', 'up']]# 评论员信息userinfo = pd.DataFrame(data['userList']).Tuserinfo = userinfo[['userid', 'nick', 'head', 'gender', 'hwlevel']].reset_index(drop=True)# 合并评论信息与评论员信息data_content = data_content.merge(userinfo, how='left')data_content.time = pd.to_datetime(data_content.time, unit='s') + pd.Timedelta(days=8/24)data_content['剧集'] = idata_content.id = data_content.id.astype('string')save_csv(data_content)# 下一个 cursorcursor = data['last']num =num + 1pages = data['oritotal']//30 + 1print(f'第{i}集的第{num}/{pages}页评论已经采集!')