Python 爬取 B 站,宋智孝李光洙哪个更受宠?

在中国,大家应该都了解《跑男》这个节目吧,跑男这个节目就是引用了韩国的《Running Man》,成员组成包括原六位成员刘在石、池石镇、金钟国、HAHA(河东勋)、宋智孝、李光洙 ,以及两位新成员全昭旻、梁世灿 。

自从限韩令发布后,Running man在除B站以外的各大视频网站均下架,所以本文从B站出发,抓取相关视频的所有评论。

由于相关视频非常多,本文选择了最具代表性,点击量观看次数最多的视频。

进入这个页面后开始抓包(https://www.bilibili.com/video/av18089528?from=search&seid= 16848360519725142300)。

不断点击下一页,可以发现reply?callback=这个文件一直在出现。

打开其中一个文件以后可以看到每一面的评论都在里面;只需构建出类似的URL就可以把所有的评论都爬下来啦。

分析一下这个URL:

https://api.bilibili.com/x/v2/replycallback=jQuery17201477141935656543_1541165464647&jsonp=jsonp&pn=368&type=1&oid=18089528&sort=0&_=1541165714862

pn是页面数,_对应距离1971年1月1日的秒数,直接用time.time就可以获得,其余参数保持不变。数据格式是Json,但是B站有点小狡猾啊~

它把所有的Json数据都存在jQuery17201477141935656543_1541165464647这个里面。

所以提取的时候要处理一下(Talk is cheap,show me the code)。

html=requests.get(url,headers=headers).text
html=json.loads(html.split(‘(‘,1))[1][:-1])

取下来存入Excel中,数据格式是这样子的:

写入CSV的时候一定要记得encoding=‘utf-8‘,就因为少了这个,数据总会乱码,因为各种奇葩的原因 (点了一下,拉宽了一下,原地保存一下) 。

数据清洗

对于B站的各种缺失数据,就直接用0替换;对于诗歌类的评论,它存到CSV时是一句占一行,而它的其余信息都会存到最后一行。

所以在处理时,把前面的n-1行打包append到n行的评论中,再把n-1行删除;对于B站返回的时间(类似于1540882722);用time.strftime(‘%Y-%m-%d %H:%M:%S,time.localtime())变换成2018/11/12 22:15:15。

数据分析

清理后一共得到7513*11条数据,接下来对数据进行一些分析,数据分析通过Python和R完成。

男女分布

从饼图可以看出,近六成的人选择保密个人信息,公开信息显示女生仅比男生多3%。这个结论是出乎意料的。原来不论男女都很喜欢Running man。

def male(sex):
    att=[‘男‘,‘女‘,‘保密‘]
    val=[]
    for i in att:
        val.append(sex.count(i))
    pie = Pie("", "性别饼图", title_pos="right", width=1200, height=600)
    pie.add("", att, val, label_text_color=None, is_label_show=True, legend_orient=‘vertical‘,
            is_more_utils=True, legend_pos=‘left‘)
    pie.render("sexPie.html")

评论周分布

Running man在韩国的更新时间是每周天下午,但是要到周一B站才会有所更新。

因此从评论周分布图可以看到,星期一的评论数是远远大于其他时间的,其次是星期二和星期天,正好在Runnning man 更新前后,对比其他时间段评论数有一定增长。

def ana_week(week):
    weeks=[‘星期天‘,‘星期一‘,‘星期二‘,‘星期三‘,‘星期四‘,‘星期五‘,‘星期六‘]
    output_file(‘week_bar.html‘)
    count=[]
    for i in sorted(set(week)):
        if not numpy.isnan(i):
            count.append(week.count(i))
    source = ColumnDataSource(data=dict(weeks=weeks, counts=count,color=[‘orange‘,‘yellowgreen‘,‘pink‘,‘darksalmon‘,‘lightgreen‘,‘paleturquoise‘,‘lightsteelblue‘]))
    p=figure(x_range=weeks, y_range=(0,4000), plot_height=250, title="Week Counts",
           toolbar_location=None, tools="")
    p.vbar(x=‘weeks‘, top=‘counts‘, color=‘color‘,width=0.9, legend="Week", source=source)
    p.legend.orientation = "horizontal"
    p.legend.location = "top_right"
    show(p)

评论时间分布

除了每周评论数,对于评论数的日趋势也十分好奇,大家一般会在什么时间段内观看评论呢?

根据上图可以看到,在6点以后迎来一个爆炸性增涨,在11点-13点之间达到峰值,其次是在15点-17点之间迎来第二波小高潮。

在晚间,除了20点有一定下降外,评论数都接近500条。而午夜评论数最少,不过还是有不少夜猫子啊。

def ana_hour(hour):
    h,k=[],[]
    for i in range(len(hour)):
        if isinstance(hour[i],str):
            h.append(hour[i][:2])
    for i in sorted(set(h)):
        k.append(h.count(i))
    print(k)
    output_file(‘hour_line.html‘)
    p = figure(plot_width=400,title=‘各小时评论数‘, plot_height=400)
    p.line(sorted(set(h)), k, line_width=2)
    p.circle(sorted(set(h)), k, fill_color="white", size=8)
    show(p)

评论字数与点赞数

对比每条评论的字数与点赞次数,从上图可以看到,评论的字数越多,获得赞的概率就越大:100字以上的评论获得赞的平均次数远高于100字以下的评论,而那些10个字以内的评论基本没有获得赞,所以只要你是认真评论写出大家的心声,就能获得大家的认同。

def com_zan(com,zan):
    q,w,e,r,t=[],[],[],[],[]
    for i in range(len(com)):
        if len(com[i])<10:
            q.append(zan[i])
        if 10<=len(com[i])<50:
            w.append(zan[i])
        if 50<=len(com[i])<100:
            e.append(zan[i])
        if 100<=len(com[i]):
            r.append(zan[i])
    a=go.Box(y=q,name=‘0-10个字‘)
    b=go.Box(y=w,name=‘10-50个字‘)
    c=go.Box(y=e,name=‘50-100个字‘)
    d=go.Box(y=r,name=‘100以上个字‘)
    e=go.Box(y=zan,name=‘所有评论‘)
    data=[a,b,e,c,d]
    layout = go.Layout(legend=dict(font=dict(size=16)),orientation=270)
    fig = go.Figure(data=data, layout=layout)
    plotly.offline.plot(data)

情感分析

大家的评论分别进行情感分析,越接近1说明正面情感越强烈;相反越靠近0负面情绪越强。

从上图可以看到,虽然有近600人的评论是非常负能量,但是绝大多数的人都是1分、0.9分。

在Running man给我们带来欢乐与感动的同时,大家对Running man是满满的宠爱啊。

def snownlp(com):
    q=[]
    for i in com:
        s=SnowNLP(i)
        q.append(round(s.sentiments,1))
    emotion=[]
    count=[]
    for i in sorted(set(q)):
        emotion.append(str(i))
        count.append(q.count(i))
    #count=[596, 481, 559, 566, 490, 617, 528, 601, 581, 809, 1685]
    #emotion=[‘0.0‘, ‘0.1‘, ‘0.2‘, ‘0.3‘, ‘0.4‘, ‘0.5‘, ‘0.6‘, ‘0.7‘, ‘0.8‘, ‘0.9‘, ‘1.0‘]
    output_file(‘评论情感分析.html‘)
    source = ColumnDataSource(data=dict(emotion=emotion, counts=count))
    p = figure(x_range=emotion, y_range=(0, 2000), plot_height=250, title="评论情感分析",
               toolbar_location=None, tools="")
    p.vbar(x=‘emotion‘, top=‘counts‘, width=0.9, source=source)
    p.legend.orientation = "horizontal"
    show(p)

话题度排行

一直都很好奇在观众心中哪个mc的话题度最高,所以做了一个话题度排行。从上图可以看到haha是最具话题性的mc(这个结果有点出乎意料呢)其次是李光洙和宋智孝。

因为笔者统计的是2018年的Running man ,所以Gary的数据是有点凄惨的。对比两个新成员,全妹的话题度比世赞高的不是一点点。

def hot(com):
    #print(com)
    output_file(‘各成员话题度.html‘)
    jzg=[‘金钟国‘,‘钟国‘,‘能力者‘]
    gary=[‘gary‘,‘狗哥‘]
    haha=[‘haha‘,‘HAHA‘,‘哈哈‘]
    qsm=[‘全昭敏‘,‘全妹‘,‘全昭body‘]
    lsz=[‘梁世赞‘,‘世赞‘,‘小不点‘]
    name=[‘池石镇‘,‘刘在石‘,‘宋智孝‘,‘李光洙‘,‘金钟国‘,‘gary‘,‘haha‘,‘全昭敏‘,‘梁世赞‘]
    csz,lzs,szx,lgz,jzg,gary,haha,qsm,lsz=[],[],[],[],[],[],[],[],[]
    for i in com:
        if  ‘池石镇‘in i or‘石镇‘ in i or‘鼻子‘in i:
            csz.append(i)
        if ‘刘在石‘in i or ‘在石‘ in i or ‘大神‘ in i or ‘蚂蚱‘ in i:
            lzs.append(i)
        if ‘宋智孝‘ in i or ‘智孝‘in i or ‘懵智‘in i or ‘美懵‘in i:
            szx.append(i)
        if ‘李光洙‘in i or ‘光洙‘in i or ‘一筐猪‘in i:
            lgz.append(i)
        if ‘金钟国‘in i or ‘钟国‘in i or ‘能力者‘in i:
            jzg.append(i)
        if ‘gary‘in i or‘狗哥‘in i:
            gary.append(i)
        if ‘haha‘in i or ‘HAHA‘in i or ‘哈哈‘in i:
            haha.append(i)
        if ‘全昭敏‘in i or ‘全妹‘in i or‘全昭body‘in i:
            qsm.append(i)
        if ‘梁世赞‘in i or‘世赞‘in i or‘小不点‘in i:
            lsz.append(i)
   count=[len(csz),len(lzs),len(szx),len(lgz),len(jzg),len(gary),len(haha),len(qsm),len(lsz)]
    source = ColumnDataSource(data=dict(name=name, counts=count,color=[‘orange‘,
‘yellowgreen‘, ‘pink‘, ‘darksalmon‘,‘lightgreen‘,‘paleturquoise‘,‘lightsteelblue‘,
‘hotpink‘,‘yellow‘]))
    p = figure(x_range=name, y_range=(0, 600), plot_height=250, title="话题度排行",
               toolbar_location=None, tools="")
    p.vbar(x=‘name‘, top=‘counts‘, color=‘color‘, width=0.9, source=source)
    p.legend.orientation = "horizontal"
    show(p)

Running man一直都不缺CP,前有周一情侣Gary和宋智孝,权力夫妇刘在石和金钟国,老年line刘在石和池石镇,我兄我弟金钟国和haha,背叛者联盟必触cross。

现在又有国民兄妹刘在石和全昭敏,麻浦兄妹宋智孝和haha,烤肉line金钟国haha等等。

他们的关系错综复杂,所以笔者打算好好扒一扒观众眼中的各种line。

成员关系矩阵

满分为100分,可以看到池石镇和刘在石;刘在石和李光洙;金钟国和宋智孝;Gary和宋智孝;haha和李光洙;全昭敏和宋智孝的相关性均非常高,其中Gary和宋智孝的相关性居然达到40,也就是说评论中如果有Gary那么有四成的概率会出现宋智孝,周一情侣真的是深入人心。

其次是宋智孝和金钟国,看来之前还一直有人说他俩会结婚也不是空穴来潮;而梁世赞与其余成员的相关性都很高,这说明大家都不怎么单独提到他,希望世赞可以早日找到自己的定位;获得观众的认可!

def network_edg_csv(com):
    df=pandas.DataFrame(columns=[‘池石镇‘,‘刘在石‘,‘宋智孝‘,‘李光洙‘,‘金钟国‘,‘gary‘,‘haha‘,‘全昭敏‘,‘梁世赞‘],index=[‘池石镇‘,‘刘在石‘,‘宋智孝‘,‘李光洙‘,‘金钟国‘,‘gary‘,‘haha‘,‘全昭敏‘,‘梁世赞‘])
    df.loc[:,:]=0.0
    for i in com:
        if  (i in ‘池石镇‘in i or‘石镇‘ in i or‘鼻子‘in i):
            df[‘池石镇‘][‘池石镇‘] = df[‘池石镇‘][‘池石镇‘] + 1
            if(‘刘在石‘in i or ‘在石‘ in i or ‘大神‘ in i or ‘蚂蚱‘ in i):
                df[‘池石镇‘][‘刘在石‘] = df[‘池石镇‘][‘刘在石‘] + 1
                df[‘刘在石‘][‘池石镇‘] = df[‘刘在石‘][‘池石镇‘] + 1
    #成员关系矩阵df计算方式:在同一个评论中,如果同时出现刘在石和池石镇,那么他们的联系值+1;再用(刘在石和池石镇的联系值/池石镇出现在评论的次数)*100得到他们的相关性系数。
    for i in df.index:
        s=df.loc[i][i]
        for j in [‘池石镇‘,‘刘在石‘,‘宋智孝‘,‘李光洙‘,‘金钟国‘,‘gary‘,‘haha‘,‘全昭敏‘,‘梁世赞‘]:
            df.loc[i][j]=df.loc[i][j]/s*100
    fig=pyl.figure()   names=[‘chishizhen‘,‘liuzaishi‘,‘songzhixiao‘,‘liguangzhu‘,‘jinzgongguo‘,‘gary‘,‘haha‘,‘quanshaomin‘,‘liangshizan‘]
    ax=fig.add_subplot(figsize=(100, 100))
    ax=seaborn.heatmap(df, cmap=‘rainbow‘,linewidths = 0.05, vmax = 100,vmin = 0,annot = True, annot_kws = { ‘size‘: 6, ‘weight‘: ‘bold‘})
    pyl.xticks(np.arange(9) + 0.5, names,rotation=-90)
    pyl.yticks(np.arange(9) + 0.5, names,rotation=360)
    ax.set_title(‘Characteristic correlation‘)  # 标题设置
    pyl.show()

最后,如果有想一起学习python,爬虫,可以来一下我的python群【 784758214 】,内有安装包和学习视频资料免费分享,好友都会在里面交流,分享一些学习的方法和需要注意的小细节,每天也会准时的讲一些项目实战案例。找工作什么最重要?看中的还是你的实战经验

原文地址:http://blog.51cto.com/14082686/2322341

时间: 2024-10-17 06:22:28

Python 爬取 B 站,宋智孝李光洙哪个更受宠?的相关文章

python爬取B站千万级数据,发现了这些热门UP主的秘密!

Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务.它的语法非常简捷和清晰,与其它大多数程序设计语言不一样,它使用缩进来定义语句. Python支持命令式程序设计.面向对象程序设计.函数式编程.面向切面编程.泛型编程多种编程范式.与Scheme.Ruby.Perl.Tcl等动态语言一样,Python具备垃圾回收

零基础如何学好python爬虫?之python爬取B站小视频

B 站真是个神奇的网站.找不到资料了,去 B 站逛一逛,保准有你满意的东西. 前几天写了个爬虫,用 path.re.BeautifulSoup 爬取的 B 站 python 视频,如果要爬取多页的话 在最下方循环中 填写好循环的次数就可以了 B 站真是个神奇的网站.找不到资料了,去 B 站逛一逛,保准有你满意的东西. 前几天写了个爬虫,用 path.re.BeautifulSoup 爬取的 B 站 python 视频,如果要爬取多页的话 在最下方循环中 填写好循环的次数就可以了 废话不多说直接上

使用python爬取P站图片

刚开学时有一段时间周末没事,于是经常在P站的特辑里收图,但是P站加载图片的速度比较感人,觉得自己身为计算机专业,怎么可以做一张张图慢慢下这么low的事,而且这样效率的确也太低了,于是就想写个程序来帮我下,但是只会C与c++的我看来是无法用他们来做这事的,于是就去学了下简单,强大的python,不得不说,python的模块的确叼,依靠几个模块就可以在完全不知道原理的前提下让程序执行相应功能,这样虽然爽但对于学习不利,我这次就权当写着玩吧,在我学会怎样使用c++来做这事之前我不会再使用python编

python 爬取B站视频弹幕信息

获取B站视频弹幕,相对来说很简单,需要用到的知识点有requests.re两个库.requests用来获得网页信息,re正则匹配获取你需要的信息,当然还有其他的方法,例如Xpath.进入你所观看的视频的页面,F12进入开发者工具,选择网络.查找我们需要的信息,发现域名那列有comment.bilibili.com 格式为xml ,文件名即为cid号.点击它后,在右边的消息头中复制请求网址,在浏览器中打开,即可获得视频全部弹幕信息.    代码如下: 1 import requests 2 imp

python爬取b站排行榜视频信息

和上一篇相比,差别不是很大 1 import xlrd#读取excel 2 import xlwt#写入excel 3 import requests 4 import linecache 5 import wordcloud 6 import jieba 7 import matplotlib.pyplot as plt 8 from bs4 import BeautifulSoup 9 10 if __name__=="__main__": 11 f = xlwt.Workbook

用python 抓取B站视频评论,制作词云

python 作为爬虫利器,与其有很多强大的第三方库是分不开的,今天说的爬取B站的视频评论,其实重点在分析得到的评论化作嵌套的字典,在其中取出想要的内容.层层嵌套,眼花缭乱,分析时应细致!步骤分为以下几点: F12进入开发者选项进入B站你想观看的视频页面,例如我看的是咬人猫的一个视频,进入开发者选项后,向下拉取视频评论,这时评论内容才被加载出来,此刻在开发者选项中网络那里就可以看到从网站获取的很多信息,仔细查找,发现我们想要的如下图:可以看到评论区的内容,点开消息头中的请求网址(https://

使用python爬取csdn博客访问量

最近学习了python和爬虫,想写一个程序练练手,所以我就想到了大家都比较关心的自己的博客访问量,使用python来获取自己博客的访问量,这也是后边我将要进行的项目的一部分,后边我会对博客的访问量进行分析,以折线图和饼图等可视化的方式展示自己博客被访问的情况,使自己能更加清楚自己的哪些博客更受关注,博客专家请勿喷,因为我不是专家,我听他们说专家本身就有这个功能. 一.网址分析 进入自己的博客页面,网址为:http://blog.csdn.net/xingjiarong 网址还是非常清晰的就是cs

python爬取某个网站的图片并保存到本地

python爬取某个网站的图片并保存到本地 #coding:utf-8 import urllib import re import sys reload(sys) sys.setdefaultencoding('gb2312') #获取整个页面的数据 def getHtml (url): page = urllib.urlopen(url) html = page.read() return html #保存图片到本地 def getImg(html): reg = r'src="(.+?\.

python爬取某个网页的图片-如百度贴吧

python爬取某个网页的图片-如百度贴吧 作者:vpoet 日期:大约在冬季 注:随意copy,不用告诉我 #coding:utf-8 import urllib import urllib2 import re if __name__ =="__main__": rex=r'src="(http://imgsrc.baidu.com/forum/w%3D580.*?\.jpg)"'; Response=urllib2.urlopen("http://t