用Python分析《工作細胞》的一萬多條評論後,非漫迷也要入番了
作者 | 量化小白一枚,上財研究生在讀,專注於資料分析與量化投資
來源 | 量化小白上分記(公眾號 id:quanthzp)
責編 | Jane
人工智慧的現狀及今後發展趨勢如何?
https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
【導語】動漫《工作細胞》最終話已經更新完畢,這部動漫在 b 站上評分高達 9.7。除了口碑之外,熱度也居高不下,更值得關注的是連很多平時不關注動漫的小夥伴也加入了追番大軍。這次我們的目標是爬取 b 站上的所有短評進行分析,用資料說明為什麼這部動漫會如此受歡迎。
一、工作細胞
《工作細胞》改編自清水茜老師的同名漫畫,由 David Production 製作。眾所周知,日本 ACG 作品向來信奉著“萬物皆可萌”的原則。前有《黑塔利亞》,後有《艦隊Collection》和《獸娘動物園》,分別講述了將國家,戰艦和動物擬人化後的故事。而在《工作細胞》裡擬人的物件則輪到了我們的細胞。
這是一個發生在人體內的故事:人的細胞數量,約為37兆2千億個。其中包括了我們的女主角:一個副業是運輸氧氣,主業是迷路的紅血球。
男主角:一個作者懶得塗色但武力值 max 的白血球。兩人一見面就並肩戰鬥,分別的時候更是滿天粉紅氣泡。
雖然嘴上說著:不會,我只是千千萬萬個白細胞中的一員。身體卻很誠實,從第一集偶遇女主到最後一集,每一集都充滿了狗糧的味道。37兆分之一的緣分果然妙不可言。
除了男女主角,配角們的人氣也都很高。連反派 boss 癌細胞都有人喜歡,主要還是因為身世感人+臉長得好。當然人氣最!最!最!高的還是我們奶聲奶氣的血小板。
據宅男們反映:“看了這麼多番。只有這一部的老婆是大家真正擁有的。”不僅有,還有很多。除了新穎的科普形式,這部番令人感觸最深的是:我們每一個人都不是孤獨的個體,有37兆個只屬於我們的細胞和我們一同工作不息。每當頹唐和失意的時候,為了那些為了保護你而戰鬥不止的免疫細胞,為了萌萌的老婆們也要振作起來啊。
《工作細胞》的成功並不是一個偶然,而是眾多因素共同作用的結果。下面從資料的角度分析它成為今年7月播放冠軍的原因。
謝謝宇哥對這部分的貢獻,顯然超出我的能力範圍!
二、爬蟲
首先要做的是爬取 b 站的所有短評,包括評論使用者名稱、評論時間、星級(評分)、評論內容、點贊數等內容,本部分內容為爬蟲程式碼的說明,不感興趣的讀者可以直接跳過,閱讀下一部分的分析。
爬的過程寫了很久,b站短評不需要登陸直接就可以爬,剛開始用類似之前爬豆瓣的方法,用 Selenium+xpath 定位爬
但 b 站短評用這種方法並不好處理。網站每次最多顯示 20 條短評,滾動條移動到最下面才會載入之後的 20 條,所以剛開始用了每次爬完之後將定位到當前爬的位置的方法,這樣定位到當前載入的最後一條時,就會載入之後的 20 條短評。
邏輯上是解決了這個問題,但真的爬的時候就出現了問題,一個是爬的慢,20條需要十來秒的樣子,這個沒關係,大不了爬幾個小時,但問題是辛辛苦苦爬了兩千多條之後,就自動斷了,不知道是什麼原因,雖然之前爬的資料都存下來了,但沒法接著斷開的地方接著爬,又要重新開始,還不知道會不會又突然斷,所以用這種方法基本就無解了。程式碼附在下面,雖然是失敗的,但也可以爬一些評論下來,供參考。
1# -*- coding: utf-8 -*-
2"""
3Created on Mon Sep 10 19:36:24 2018
4"""
5from selenium import webdriver
6import pandas as pd
7from datetime import datetime
8import numpy as np
9import time
10import os
11
12os.chdir('F:\\python_study\\pachong\\工作細胞')
13def gethtml(url):
14
15 browser = webdriver.PhantomJS()
16 browser.get(url)
17 browser.implicitly_wait(10)
18 return(browser)
19
20def getComment(url):
21
22 browser = gethtml(url)
23 i = 1
24 AllArticle = pd.DataFrame(columns = ['id','author','comment','stars1','stars2','stars3','stars4','stars5','unlike','like'])
25 print('連線成功,開始爬取資料')
26 while True:
27
28 xpath1 = '//*[@id="app"]/div[2]/div[2]/div/div[1]/div/div/div[4]/div/div/ul/li[{}]'.format(i)
29 try:
30 target = browser.find_element_by_xpath(xpath1)
31 except:
32 print('全部爬完')
33 break
34
35 author = target.find_element_by_xpath('div[1]/div[2]').text
36 comment = target.find_element_by_xpath('div[2]/div').text
37 stars1 = target.find_element_by_xpath('div[1]/div[3]/span/i[1]').get_attribute('class')
38 stars2 = target.find_element_by_xpath('div[1]/div[3]/span/i[2]').get_attribute('class')
39 stars3 = target.find_element_by_xpath('div[1]/div[3]/span/i[3]').get_attribute('class')
40 stars4 = target.find_element_by_xpath('div[1]/div[3]/span/i[4]').get_attribute('class')
41 stars5 = target.find_element_by_xpath('div[1]/div[3]/span/i[5]').get_attribute('class')
42 date = target.find_element_by_xpath('div[1]/div[4]').text
43 like = target.find_element_by_xpath('div[3]/div[1]').text
44 unlike = target.find_element_by_xpath('div[3]/div[2]').text
45
46
47 comments = pd.DataFrame([i,author,comment,stars1,stars2,stars3,stars4,stars5,like,unlike]).T
48 comments.columns = ['id','author','comment','stars1','stars2','stars3','stars4','stars5','unlike','like']
49 AllArticle = pd.concat([AllArticle,comments],axis = 0)
50 browser.execute_script("arguments[0].scrollIntoView();", target)
51 i = i + 1
52 if i%100 == 0:
53 print('已爬取{}條'.format(i))
54 AllArticle = AllArticle.reset_index(drop = True)
55 return AllArticle
56
57url = 'https://www.bilibili.com/bangumi/media/md102392/?from=search&seid=8935536260089373525#short'
58result = getComment(url)
59#result.to_csv('工作細胞爬蟲.csv',index = False)
這種方法爬取失敗之後,一直不知道該怎麼處理,剛好最近看到網上有大神爬貓眼評論的文章,照葫蘆畫瓢嘗試了一下,居然成功了,而且爬的速度也很快,十來分鐘就全爬完了,思路是找到評論對應的 Json 檔案,然後獲取 Json 中的資料,過程如下。
在 Google 瀏覽器中按 F12 開啟卡發者工具後,選擇 Network
往下滑動,會發現過一段時間,會出現一個 fetch,右鍵開啟後發現,裡面就是 20 條記錄,有所有我們需要的內容,Json 格式。
所以現在需要做的就是去找這些 Json 檔案的路徑的規律。多看幾條之後,就發現了規律:
第一個 Json:
https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0
第二個 Json:
https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0&cursor=76553500953424
第三個Json:
https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0&cursor=76549205971454
顯然所有的 Json 路徑的前半部分都是一樣,都是在第一條 Json 之後加上不同的 cursor = xxxxx,所以只要能找到 cursor 值的規律,就可以用迴圈的辦法,爬完所有的 Json,這個值看上去沒什麼規律,最後發現,每一個 Json 路徑中 cursor 值就藏在前一個 Json 的最後一條評論中
在 python 中可以直接把 JSON 轉成字典,cursor 值就是最後一條評論中鍵 cursor 的值,簡直不要太容易。
所以爬的思路就很清晰了,從一個 Json 開始,爬完 20 條評論後,獲取最後一個評論中的cursor值,更改路徑之後獲取第二個 Json,重複上面的過程,直到爬完所有的 Json。
至於如何知道爬完了所有 Json,也很容易,每個 Json 中一個total鍵,表示了當前一共有多少條評論,所以只需要寫一個while迴圈,當爬到的評論數達到total值時停止。
爬的過程中還發現,有些 Json 中的評論數不夠 20 條,如果每次用 20 去定位,中間會報錯停止,需要注意一下。所以又加了一行程式碼,每次獲得 Json 後,通過 len() 函式得到當前 Json中一共包含多少條評論,cursor 在最後一個評論中。
以上是整個爬的思路,我們最終爬到以下資訊:
需要說明的地方,一個是 liked 按照字面意思應該是使用者的點贊數,但爬完才發現全是 0,沒有用。另一個是關於時間,裡面有 ctime 和 mtime 兩個跟時間有關的值,看了幾個,基本都是一樣的,有個別不太一樣,差的不多,就只取了 ctime,我猜可能一個是點選進去的時間,一個是評論提交時間,但沒法驗證,就隨便取一個算了,ctime 的編碼很奇怪,比如某一個是 ctime = 1540001677,渣渣之前沒有見過這種編碼方式,請教了大佬之後知道,這個是Linux系統上的時間表示方式,是1970 年 1 月 1 日 0 時 0 分 0 秒到當時時點的秒數,python 中可以直接用 time.gmtime() 函式轉化成年月日小時分鐘秒的格式。還有 last_ep_index 裡面存的是使用者當前的看劇狀態,比如看至第 13 話,第 6 話之類的,但後來發現很不準,絕大多數使用者沒有 last_ep_index 值,所以也沒有分析這個變數。
程式碼如下:
1import requests
2from fake_useragent import UserAgent
3import json
4import pandas as pd
5import time
6import datetime
7headers = { "User-Agent": UserAgent(verify_ssl=False).random}
8comment_api = 'https://bangumi.bilibili.com/review/web_api/short/list?media_id=102392&folded=0&page_size=20&sort=0'
9
10# 傳送get請求
11response_comment = requests.get(comment_api,headers = headers)
12json_comment = response_comment.text
13json_comment = json.loads(json_comment)
14
15total = json_comment['result']['total']
16
17cols = ['author','score','disliked','likes','liked','ctime','score','content','last_ep_index','cursor']
18dataall = pd.DataFrame(index = range(total),columns = cols)
19
20
21j = 0
22while j <total:
23 n = len(json_comment['result']['list'])
24 for i in range(n):
25 dataall.loc[j,'author'] = json_comment['result']['list'][i]['author']['uname']
26 dataall.loc[j,'score'] = json_comment['result']['list'][i]['user_rating']['score']
27 dataall.loc[j,'disliked'] = json_comment['result']['list'][i]['disliked']
28 dataall.loc[j,'likes'] = json_comment['result']['list'][i]['likes']
29 dataall.loc[j,'liked'] = json_comment['result']['list'][i]['liked']
30 dataall.loc[j,'ctime'] = json_comment['result']['list'][i]['ctime']
31 dataall.loc[j,'content'] = json_comment['result']['list'][i]['content']
32 dataall.loc[j,'cursor'] = json_comment['result']['list'][n-1]['cursor']
33 j+= 1
34 try:
35 dataall.loc[j,'last_ep_index'] = json_comment['result']['list'][i]['user_season']['last_ep_index']
36 except:
37 pass
38
39 comment_api1 = comment_api + '&cursor=' + dataall.loc[j-1,'cursor']
40 response_comment = requests.get(comment_api1,headers = headers)
41 json_comment = response_comment.text
42 json_comment = json.loads(json_comment)
43
44 if j % 50 ==0:
45 print('已完成 {}% !'.format(round(j/total*100,2)))
46 time.sleep(0.5)
47
48
49
50dataall = dataall.fillna(0)
51
52def getDate(x):
53 x = time.gmtime(x)
54 return(pd.Timestamp(datetime.datetime(x[0],x[1],x[2],x[3],x[4],x[5])))
55
56dataall['date'] = dataall.ctime.apply(lambda x:getDate(x))
57
58dataall.to_csv('bilibilib_gongzuoxibao.xlsx',index = False)
三、影評分析
最終一共爬到了 17398 條影評資料。裡面的 date 是用 ctime 轉過來的,接下來對資料進行一些分析,資料分析通過 python3.6 完成。
-
評分分佈
評分取值範圍為2、4、6、8、10分,對應1-5顆星
可以看出,幾乎所有的使用者都給了這部動漫五星好評,影響力可見一斑。
-
評分時間分佈
將這部動漫從上線至今所有的評分按日進行平均,觀察評分隨時間的變化情況
可以看出,評分一直居高不下,尤其起始和結束時都接近滿分,足見這是一部良好開端、圓滿結束的良心作品。
-
每日評論數
看完評分之後,再看看評論相關的資料,我最感興趣的是,這些評論的時間分佈是怎麼樣的,統計了每一日的評論數之後,得到了評論數的分佈圖
基本上是每出了新的一話,大家看完後就會在短評中分享自己的感受,當然同樣是起始和結束階段的評論數最多,對比同期的百度指數
-
評論日內分佈
除了每日的評論數,也想分析一下評論的日內趨勢,使用者都喜歡在每日的什麼時間進行評論?將評論分 24 個小時求和彙總後,得到了下圖
不過這個結果就不是很理想了,橫軸是時間,縱軸是評論數,中午到下午的趨勢上升可以理解,晚上七八點沒有人評論反倒是凌晨三四點評論數最多,這個就很反常了,可能是評論在系統中上線的時間有一定偏差?
-
好評字數
此外還想分析一下,是否點贊數多的,一定是寫的字數越多的?因為文章中大部分的評論是沒有點讚的,所以這裡中統計了有點贊(likes>0)的評論點贊數和評論字數的資料。由於有一條評論字點贊數太多,嚴重偏離整體趨勢,所以做了對數圖進行觀察。
整體來看,似乎沒什麼關係,大量字數 1-100 不等的,點贊數都為 1,點贊數大於 5 的部分有一定的正相關性,說明評論不僅要看數量,還要看質量,寫出了大家的心聲,大家才會使勁點贊。
-
評論分析 TF-IDF
分析完基礎資料後,想更深入挖掘一下評論資訊,大家都說了些什麼?為什麼這部劇這麼受歡迎?也許都能在評論中找到答案。
jieba 分詞、去除停止詞、計算詞頻和 TF-IDF 的過程不表,與之前兩篇文章類似。我們提取了重要性前 500 的詞,這裡展示部分
血小板高居首位,畢竟大家對萌萌噠事物都是沒什麼抵抗力的。
詞語中也存在一些意義不大的詞,前期處理不太到位。不過從這些詞雲中還是可以看出很多東西,為什麼這部劇如此受歡迎?這裡通過分詞可以得到以下三個解釋:
1. 題材好:科普類動漫,老少皆宜
評論中提到了科普、生物、題材等詞,還有各種細胞。區別於一般科普向動漫受眾低幼的問題,這部番的受眾年齡比較廣泛。因為所涉及到的知識並不算過於常識。動漫中,每一話,身體的主人都會生一場病,每次出現新的細胞和病毒出現時,都會對他們的身份有比較詳細和準確的介紹
這種形式寓教於樂,同時戰鬥的過程也充分地體現了每種細胞的特性。例如,前期因為戰鬥力弱而被別的細胞瞧不起的嗜酸性粒細胞,在遇到寄生蟲的時候大放異彩。可以說,每一種細胞爆種都爆得都有理有據。
2. 人設好
這部番把幾乎人體所有的細胞擬人化:紅細胞、白細胞、血小板、巨噬細胞等。每一種細胞都有比較獨特的設定,從御姐到蘿莉,從高冷到話癆。十幾個出場的主要人物都各自有立得住的萌點。滿足各種口味的需求。
3. 製作精良
這一點是毋庸置疑的,好的人設好的題材,如果沒有好的製作,都是白談,評論中也有很多人提到了“聲優”、“配音”等。
當然一部劇能夠火,不僅僅是這麼簡單的原因,這裡所說的,只是從資料可以看出的,觀眾的直觀感受。
最後我們以萌萌噠血小板詞雲作為文章的結尾。
(本文為AI科技大本營轉載文章,轉載請聯絡原作者)
如何挑戰百萬年薪的人工智慧!
https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
群招募
掃碼新增小助手微信,回覆:公司+研究方向(學校+研究方向),邀你加入技術交流群。技術群稽核較嚴,敬請諒解。
推薦閱讀:
❤點選“閱讀原文”,檢視歷史精彩文章。
相關文章
- 流式細胞分析器:FlowJo For Mac啟用版Mac
- Python | 一萬多條拼車資料,看春運的遷徙圖Python
- 單細胞分析實錄(18): 基於CellPhoneDB的細胞通訊分析及視覺化 (上篇)視覺化
- 單細胞分析實錄(19): 基於CellPhoneDB的細胞通訊分析及視覺化 (下篇)視覺化
- 流式細胞分析軟體:FlowJo 10 for MacMac
- 《細胞》重磅:圍獵免疫細胞!科學家首次發現,免疫細胞與細菌之間的經典捕食關係,竟被霍亂弧菌顛覆了
- Python爬取貓眼評分9.5的《海王》的3萬條評論Python
- 關於《死亡細胞》美術工作流的初步探索
- 《細胞發現》:分析近10萬個細胞,復旦附屬中山醫院團隊發現了肝癌免疫逃逸新機制!
- 用Python分析44萬條資料,揭祕如何成為網易雲音樂評論區的網紅段子手Python
- 細胞大小,真核細胞直徑平均: 3~30μm;
- FlowJo 10 for Mac(流式細胞分析軟體) v10.4啟用版Mac
- 新番神器:日本住宅IP引領你進入動漫世界
- 單細胞分析實錄(5): Seurat標準流程
- 隨機的細胞騎士——《死亡細胞》Rougelike隨機性思路的得與失隨機
- FlowJo 10 - 實現高效、精準的流式細胞分析 mac版Mac
- 年薪60W的Android程式設計師究竟多累、多苦?一條高贊評論紮了無數人的心Android程式設計師
- 【GUI軟體開發】小紅書評論採集:自動採集1w多條,含二級評論!GUI
- Python中的numba的基本應用!讓你的Python快一萬倍!Python
- 《流浪地球》靠“太空戰狼”才火起來?我們分析完21萬條評論後發現真相!
- 高三學生憑神經網路論文研究網路暴力!00後也要出道了?神經網路
- 非度量多維尺度分析
- 最近幾天沒有好好學習……用動漫調整了一番
- 單細胞分析實錄(9): 展示marker基因的4種圖形(二)
- 3 條 sql 是實現知乎評論,7 條 sql 實現點贊 + 評論,且可擴充套件SQL套件
- 評論:iPad都賣不動了 解析平板產業背後事iPad產業
- EDG奪冠!用Python分析22.3萬條資料:粉絲都瘋了!Python
- 【程式碼更新】單細胞分析實錄(21): 非負矩陣分解(NMF)的R程式碼實現,只需兩步,啥圖都有矩陣
- 當你點開這首《八月》的歌:9400餘條評論的分析與挖掘
- 《細胞·代謝》:禁食傷免疫的機制,找到了!科學家發現,禁食會啟動免疫細胞歸巢開關,降低免疫細胞抗感染能力
- FlowJo 10 for Mac,細胞分析的必備神器 支援M1/M2Mac
- 某公司程式設計師薪資一萬,而“程式設計師鼓勵師”月薪兩萬,網友評論炸鍋了程式設計師
- Swift Protobuf 初探 —— 繼 XML 後,JSON 也要被淘汰了嗎SwiftXMLJSON
- 單細胞分析實錄(2): 使用Cell Ranger得到表達矩陣Ranger矩陣
- 珀金埃爾默推出業界首創細胞分析解決方案
- 《細胞·代謝》:運動保肝護代謝的機制,終於搞清楚了!
- AI為癌細胞殺手“染色”,輔助醫生選擇治療方案 | 附論文AI
- FlowJo 10: 細胞世界的卓越洞察者 mac版Mac