《云南虫谷》爆火播放中,Python抓取3

2. 爬虫过程


通过网页分析和我们的采集需求,整个过程可以分为以下几部分:

  • 爬取剧集页面数据

  • 解析得到剧集ID和剧集评论ID

  • 采集全部剧集评论

  • 保存数据到本地

2.1. 引入需要的库

import requests

import re

import pandas as pd

import 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_encoding

text = r.text

去掉非字符数据

html = re.sub(‘\s’, ‘’, text)

return html

2.3. 解析剧集ID和剧集评论ID

# 传入电视剧等的id,用于爬取剧集id和评论id

def 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_ids

data_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

初始 cursor

cursor = 0

num = 0

while 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 = 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’]).T

userinfo = 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[‘剧集’] = i

data_content.id = data_content.id.astype(‘string’)

save_csv(data_content)

下一个 cursor

cursor = data[‘last’]

num =num + 1

pages = data[‘oritotal’]//30 + 1

print(f’第{i}集的第{num}/{pages}页评论已经采集!')

2.5. 保存数据到本地

# 将评论数据保存本地

def save_csv(df):

file_name = ‘评论数据.csv’

if os.path.exists(file_name):

df.to_csv(file_name, mode=‘a’, header=False,

index=None, encoding=‘utf_8_sig’)

else:

df.to_csv(file_name, index=None, encoding=‘utf_8_sig’)

print(‘数据保存完成!’)

3. 数据统计与可视化展示


本次的数据统计与可视化展示方法可以参考此前推文《》和《》等

3.1. 数据预览

抽样5条看看

df.sample(5)

看看数据信息

df.info()

<class ‘pandas.core.frame.DataFrame’>

RangeIndex: 35758 entries, 0 to 35757

Data columns (total 12 columns):

Column Non-Null Count Dtype


0 id 35758 non-null int64

1 targetid 35758 non-null int64

2 parent 35758 non-null int64

3 time 35758 non-null object

4 userid 35758 non-null int64

5 content 35735 non-null object

6 up 35758 non-null int64

7 nick 35758 non-null object

8 head 35758 non-null object

9 gender 35758 non-null int64

10 hwlevel 35758 non-null int64

11 剧集 35758 non-null int64

dtypes: int64(8), object(4)

memory usage: 3.3+ MB

才哥也进行了评论,我们看看是不是采集到了

才哥的评论

才哥的userid1296690233,我们查询一下,发现才哥VIP等级居然6级

df.query(‘userid==1296690233’)

head字段是头像,我们看看是不是才哥头像

对上了,对上了!! 3.2. 分集评论数 绘图参考《》,所以我们这里是Pandas绘制带交互的可视化图,引入环境:

import pandas as pd

import pandas_bokeh

pandas_bokeh.output_notebook()

pd.set_option(‘plotting.backend’, ‘pandas_bokeh’)

接下来,正式的数据统计与可视化展示开始

from bokeh.transform import linear_cmap

from bokeh.palettes import Spectral

from bokeh.io import curdoc

curdoc().theme = ‘caliber’

episode_comment_num = df.groupby(‘剧集’)[‘id’].nunique().to_frame(‘评论数’)

y = episode_comment_num[‘评论数’]

mapper = linear_cmap(field_name=‘评论数’, palette=Spectral[11] ,low=min(y) ,high=max(y))

episode_bar = episode_comment_num.plot_bokeh.bar(

ylabel=“评论数量”,

title=“分集评论数”,

color=mapper,

alpha=0.8,

legend=False

)

我们可以看到,第一集评论数最高,高达1.7万,占了全部评论的一半;其次是第7集的评论数,主要是本周播到了第7集哈!

3.3. 分日期评论数

df[‘日期’] = pd.to_datetime(df.time).dt.date

date_comment_num = df.groupby(‘日期’)[‘id’].nunique().to_frame(‘评论数’)

date_comment_num.index = date_comment_num.index.astype(‘string’)

y = date_comment_num[‘评论数’]

mapper = linear_cmap(field_name=‘评论数’, palette=Spectral[11] ,low=min(y) ,high=max(y))

date_bar = date_comment_num.plot_bokeh.bar(

ylabel=“评论数量”,

title=“分日期评论数”,

color=mapper,

alpha=0.8,

legend=False

)

3.4. 分时评论数

df[‘时间’] = pd.to_datetime(df.time).dt.hour

date_comment_num = pd.pivot_table(df,

values=‘id’,

index=[‘时间’],

columns=[‘日期’],

aggfunc=‘count’

)

time_line = date_comment_num.plot_bokeh(kind=“line”,

legend=“top_left”,

title=“分时评论数”

)

åæ¶è¯è®ºæ°​​

通过分时评论数曲线,我们发现在首播当日8点的小时评论数冲击到最高,此后比较符合电视剧观看行为:中午、晚上及午夜较高。

3.5. 评论员VIP等级分布

vip_comment_num = df.groupby(‘hwlevel’).agg(用户数=(‘userid’,‘nunique’),

评论数=(‘id’,‘nunique’)

)

vip_comment_num[‘人均评论数’] = round(vip_comment_num[‘评论数’]/vip_comment_num[‘用户数’],2)

usernum_pie = vip_comment_num.plot_bokeh.pie(

y=“用户数”,

colormap=Spectral[9],

title=“评论员VIP等级分布”,

)

不得不说,评论的人大部分都是VIP用户,难怪腾讯视频要搞什么超前点播弄所谓VIP上的VIP。。。

不同VIP用户人均评论数会有不同吗?

y = vip_comment_num[‘人均评论数’]

mapper = linear_cmap(field_name=‘人均评论数’, palette=Spectral[11] ,low=min(y) ,high=max(y))

vipmean_bar = vip_comment_num.plot_bokeh.bar(

y = ‘人均评论数’,

ylabel=“人均评论数”,

title=“不同VIP用户人均评论数”,

color=mapper,

alpha=0.8,

legend=False

)

基本呈现一个VIP等级越高 评价意愿越高!但是为什么呢?

3.6. 评论长度

写评论的网友大部分都是666,好看之类的词汇,比如才哥就是等更新三个字,那么一般都会评价多少个字符呢?

import numpy as np

df[‘评论长度’] = df[‘content’].str.len()

df[‘评论长度’] = df[‘评论长度’].fillna(0).astype(‘int’)

contentlen_hist = df.plot_bokeh.hist(

y=‘评论长度’,

ylabel=“评论数”,

bins=np.linspace(0, 100, 26),

vertical_xlabel=True,

hovertool=False,

title=“评论点赞数直方图”,

color=‘red’,

line_color=“white”,

legend=False,

normed=100,

)

我们找几个评论内容老长的看看

(df.sort_values(by=‘评论长度’,ascending=False)

[[‘剧集’,‘content’,‘评论长度’,‘nick’,‘hwlevel’]].head(3)

.style.hide_index()

)

我想说,这评论是在那抄袭的,还是真有才啊?

3.7. 评论点赞数

咱们就看看被点赞最多的几条吧

# pd.set_option(‘display.max_colwidth’,1000)

(df.sort_values(by=‘up’,ascending=False)

[[‘剧集’,‘content’,‘up’,‘nick’,‘hwlevel’]].head()

.style.hide_index()

)

看地图 别迷路!是有什么梗吗?超8000的点赞~~ 3.8. 评论最多的用户

user_comment_num = df.groupby(‘userid’).agg(评论数=(‘id’,‘nunique’),

vip等级=(‘hwlevel’,‘max’)

).reset_index()

user_comment_num.sort_values(by=‘评论数’,ascending=False).head()

​​评价33条,这用户也是很牛!!我们看看他都评啥了:

df.query(‘userid==640014751’)[[‘nick’,‘剧集’,‘time’,‘content’]].sort_values(by=‘time’)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-7LlEB01p-1713712783158)]

[外链图片转存中…(img-rtLK9QTT-1713712783159)]

[外链图片转存中…(img-AxfQW0dw-1713712783160)]

[外链图片转存中…(img-6Iw89xwf-1713712783160)]

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)

  • 28
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值