1. 程式人生 > >Python 爬取 B 站資料分析,宋智孝李光洙誰最受中國粉絲喜愛

Python 爬取 B 站資料分析,宋智孝李光洙誰最受中國粉絲喜愛

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 左伊雅

責編 | 胡巍巍

《Running Man》是韓國SBS電視臺在《星期天真好》單元推出的戶外競技真人秀節目。

節目致力於打造一個不同於Real variety的新型態娛樂節目。每期有不同的主題,由不同的嘉賓參演,分為不同的隊伍進行比賽,通過完成各種遊戲任務,最後獲勝一方將獲得稱號或獎品。

成員組成包括原六位成員劉在石、池石鎮、金鐘國、HAHA(河東勳)、宋智孝、李光洙 ,以及兩位新成員全昭旻、樑世燦

640?wx_fmt=png

抓取資料

自從限韓令釋出後,Running man在除B站以外的各大視訊網站均下架,所以本文從B站出發,抓取相關視訊的所有評論。

由於相關視訊非常多,本文選擇了最具代表性,點選量觀看次數最多的視訊。

進入這個頁面後開始抓包(https://www.bilibili.com/video/av18089528?from=search&seid=16848360519725142300)。

不斷點選下一頁,可以發現reply?callback=這個檔案一直在出現。

640?wx_fmt=png

開啟其中一個檔案以後可以看到每一面的評論都在裡面;只需構建出類似的URL就可以把所有的評論都爬下來啦。

640?wx_fmt=png

分析一下這個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中,資料格式是這樣子的:

640?wx_fmt=png

寫入CSV的時候一定要記得encoding='utf-8',就因為少了這個,資料總會亂碼,因為各種奇葩的原因

(點了一下,拉寬了一下,原地儲存一下)

640?wx_fmt=png

資料清洗

對於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。

640?wx_fmt=png

640?wx_fmt=png

資料分析

清理後一共得到7513*11條資料,接下來對資料進行一些分析,資料分析通過Python和R完成。

640?wx_fmt=png

男女分佈

640?wx_fmt=png

從餅圖可以看出,近六成的人選擇保密個人資訊,公開資訊顯示女生僅比男生多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")

640?wx_fmt=png

評論周分佈

640?wx_fmt=png

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)

640?wx_fmt=png

評論時間分佈

除了每週評論數,對於評論數的日趨勢也十分好奇,大家一般會在什麼時間段內觀看評論呢?

640?wx_fmt=png

根據上圖可以看到,在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)

640?wx_fmt=png

評論字數與點贊數

640?wx_fmt=png

對比每條評論的字數與點贊次數,從上圖可以看到,評論的字數越多,獲得讚的概率就越大: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)

640?wx_fmt=png

情感分析

640?wx_fmt=png

將大家的評論分別進行情感分析,越接近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=[5964815595664906175286015818091685]
    #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=(02000), 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)

640?wx_fmt=png

話題度排行

640?wx_fmt=png

一直都很好奇在觀眾心中哪個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=(0600), 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。

640?wx_fmt=png

成員關係矩陣

640?wx_fmt=png

滿分為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 ['池石鎮','劉在石','宋智孝','李光洙','金鐘國',

相關推薦

Python B 資料分析中國粉絲喜愛

作者 | 左伊雅責編 | 胡巍巍《Running Man》是韓國SBS電視臺在《星期天真好》單元

Python B 哪個更受寵?

column 51cto vba imageview 韓國 water range vmax 關系 在中國,大家應該都了解《跑男》這個節目吧,跑男這個節目就是引用了韓國的《Running Man》,成員組成包括原六位成員劉在石、池石鎮、金鐘國、HAHA(河東勛)、宋智孝、李

pythonB千萬級數據發現了這些熱門UP主的秘密!

python 爬蟲 科技 web 編程Python(發音:英[?pa?θ?n],美[?pa?θɑ:n]),是一種面向對象、直譯式電腦編程語言,也是一種功能強大的通用型語言,已經具有近二十年的發展歷史,成熟且穩定。它包含了一組完善而且容易理解的標準庫,能夠輕松完成很多常見的任務。它的語法非常簡捷和清晰,與其它大

PythonB彈幕的思路和流程

做nlp專案,除了各大電商評論和微博資料,彈幕分析對於輿論和該視訊的推廣都是有幫助的,下面主要說說這麼從B站爬取彈幕。 過程很簡單,我們來看看: 1. 首先,bilibili的彈幕是在xml檔案裡,每個視訊都有其對應的cid和aid,我們取到cid中的數字放入http://comment

利用PythonB攝影欄目的圖片

Python中可以用作爬蟲的庫有兩個,一個是urllib,一個是request,推薦使用後一種,這才是給人類使用的爬蟲庫,上手十分簡單! request庫使用教程 話說回來,B站中由專門下載圖片的API,因此爬取圖片還是比較方便的,找到你喜歡的攝影照片的id,加在URL("https://a

Python 網路爬蟲實戰: B《全職高手》20萬條評論資料

本週我們的目標是:B站(嗶哩嗶哩彈幕網 https://www.bilibili.com )視訊評論資料。 我們都知道,B站有很多號稱“鎮站之寶”的視訊,擁有著數量極其恐怖的評論和彈幕。所以這次我們的目標就是,爬取B站視訊的評論資料,分析其為何會深受大家喜愛。 首先去調研一下,B站評論數量最多的視訊是哪一

pythonB視頻評論制作詞雲

port mil query 雲圖 ges cal 爬取 close hid python 作為爬蟲利器,與其有很多強大的第三方庫是分不開的,今天說的爬取B站的視頻評論,其實重點在分析得到的評論化作嵌套的字典,在其中取出想要的內容。層層嵌套,眼花繚亂,分析時應細致!步驟分為

如何利用Python快速B全站視訊資訊

B 站我想大家都熟悉吧,其實 B 站的爬蟲網上一搜一大堆。不過 紙上得來終覺淺,絕知此事要躬行,我碼故我在。最終爬取到資料總量為 760萬 條。 準備工作 首先開啟 B 站,隨便在首頁找一個視訊點選進去。常規操作,開啟開發者工具。這次是目標是通過爬取 B 站提供的 api 來獲取視訊資

Python爬蟲實例:B《工作細胞》短評——異步加載信息的

localtime pre global web for short sco 網頁解析 save 《工作細胞》最近比較火,bilibili 上目前的短評已經有17000多條。 先看分析下頁面 右邊 li 標簽中的就是短評信息,一共20條。一般我們加載大量數據的時候,都

Python爬蟲例項:B《工作細胞》短評——非同步載入資訊的

《工作細胞》最近比較火,bilibili 上目前的短評已經有17000多條。 先看分析下頁面   右邊 li 標籤中的就是短評資訊,一共20條。一般我們載入大量資料的時候,都會做分頁,但是這個頁面沒有,只有一個滾動條。 隨著滾動條往下拉,資訊自動載入了,如下圖,變40

如何用Python快速B全站視訊資訊

B站我想大家都熟悉吧,其實 B 站的爬蟲網上一搜一大堆。不過紙上得來終覺淺,絕知此事要躬行,我碼故我在。最終爬取到資料總量為 760萬 條。 準備工作 首先開啟 B 站,隨便在首頁找一個視訊點選進去。常規操作,開啟開發者工具。這次是目標是通過爬取 B 站提供的 api 來獲取視訊資訊,不去解析網頁

利用Python朋友圈資料到你開始懷疑人生

人生最難的事是自我認知,用Python爬取朋友圈資料,讓我們重新審視自己,審視我們周圍的圈子。 文:朱元祿(@資料分析-jacky) 哲學的兩大問題:1、我是誰?2、我們從哪裡來? 本文 jacky試圖用Python,資料化、聚類化我們的人格標籤,試圖回答"我是誰?

Python天氣預報資料並存入到本地EXCEL中

近期忙裡偷閒,搞了幾天python爬蟲,基本可以實現常規網路資料的爬取,比如糗事百科、豆瓣影評、NBA資料、股票資料、天氣預報等的爬取,整體過程其實比較簡單,有一些HTML+CSS+DOM樹等知識就很easy,我就以天氣預報資料的爬取為例,整理出來。 需求:採

Python爬蟲實戰之B番劇資訊(詳細過程)

目標:爬取b站番劇最近更新 輸出格式:名字+播放量+簡介 那麼開始擼吧~ 用到的類庫: requests:網路請求 pyquery:解析xml文件,像使用jquery一樣簡單哦~ 1.分析頁面佈局,找到需要爬取的內

Python王者榮耀官網實現一對一下載軟件!

案例 界面 image inter ima requests mage 視頻教程 inf 效果: 我沒有弄文件夾保存,因為皮膚與英雄都是一一對應,這樣子更加方便操作。 點擊下載皮膚後,會自動從官網下載一個json文件,所以出了新英雄、新皮膚軟件會自動更新。高

python 了租房資料

  爬取連結:https://sh.lianjia.com/zufang/ 程式碼如下: import requests # 用於解析html資料的框架 from bs4 import BeautifulSoup # 用於操作excel的框架 from xlwt import

Python微博資料生成詞雲圖片

很早之前寫過一篇怎麼利用微博資料製作詞雲圖片出來,之前的寫得不完整,而且只能使用自己的資料,現在重新整理了一下,任何的微博資料都可以製作出來,放在今天應該比較應景。 一年一度的虐汪節,是繼續蹲在角落默默吃狗糧還是主動出擊告別單身汪加入散狗糧的行列就看你啦,七夕送什麼才有心意,程式猿可以試試用

Python網頁上的小說讓你從此告別書荒!

eset 爬取網頁 網站 鏈接 表頭 寫入 改變 span 人生 人生苦短,我用Python。有道愛看小說的小夥伴們,在看小說的期間總會遇到那麽一段書荒期,在這段期間想看書卻找不到,要麽就是要VIP,要麽就是下載不了。所以學會爬取網站上的小說是很有必要的,今天就以爬取筆趣閣

Python微博資料生成詞雲圖片

很早之前寫過一篇怎麼利用微博資料製作詞雲圖片出來,之前的寫得不完整,而且只能使用自己的資料,現在重新整理了一下,任何人的微博資料都可以製作出來,即使是Python小白也能分分鐘做出來。 準備工作 本環境基於Python3,理論上Python2.7也是可行的,先安裝必要的第三方依賴包: #

Python Yahoo! Finance 資料問題總結

在《Python for Data Analysis》的第五章 Pandas 入門中,有一段分析 Yahoo! Fiannce 的股票價格和成交量的程式碼,此程式碼年代已久,如果照寫,根本不能正確執行,本篇文章總結了我遇到的幾個問題,以及解決辦法。 import