作者:丁彥軍
來源:戀習Python(ID:sldata2017)
20年裡本山老師的影響力是毋庸置疑的,但是不是單口相聲更不是獨角戲,他的成功也是離不開搭檔的配合,大家最熟悉的搭檔應該是範偉何高秀敏。三個人作為黃金搭檔也是演繹了許多經典作品比如《賣拐》《買車》《功夫》等。
除了範偉和高秀敏,最令人印象深刻的搭檔就是宋丹丹了,雖然合作的不是特別多但是二人合作的《昨天今天明天》和《小崔說事》太深入人心,白雲黑土成了大家最喜愛的大叔大媽但宋丹丹多次說過上春晚太累,短期應該不會在合作了吧。
最近你有沒有被“改革春風吹滿地, 中國人民真爭氣”魔性的旋律所洗腦?這段影片一經釋出,就迅速攻佔“快手”“抖音”等各大短影片平臺,近日臨近春節,彷彿又開始爆發,儼然已經從2018年末火到了2019年初。
恐怕連趙本山本人也不敢相信,自己這麼多年演的小品,被人剪輯改變成鬼畜神曲《念詩之王》後,這些經典臺詞煥發了第二春。《念詩之王》在B站播放量高達2400萬,本山大叔,即便已經七八年沒上春晚了,依然是毋庸置疑的高人氣IP!
接下來,我們透過Python大法透過獲取B站:【春晚鬼畜】趙本山:我就是念詩之王!(https://www.bilibili.com/video/av19390801/)4萬條資料評論,與大家一起看看其背後火起來的原因。
還是老規矩,老套路(是不是有股熟悉的味道),我們常用的三部曲:資料獲取、資料清洗預覽、資料分析視覺化。
01 資料獲取
在獲取影片評論之前,我們首要做的就是分析其網頁結構,尋找標的資料(也就是我們要的評論資料在哪裡,這點很重要)
最終發現,標的資料的url連結為:
https://api.bilibili.com/x/v2/reply?&type;=1&oid;=19390801&pn;=1
由上圖可看出,其評論資料是以json資料形式存在於網頁端的,可看出一共有1946頁評論,每頁評論20條,總評論63579條(樓層下麵存在評論)。今天戀習Python與大家一起主要是爬取樓層評論,共1940*20=38920條。
接下來,就爬取思路很明確,從一個JSON檔案開始,爬完20條評論,更改路徑後獲取第二個JSON檔案,以此類推,直到爬完所有的評論資料。
我們主要爬取的資料資訊有8個維度,如下:
詳細程式碼:
import requests
from fake_useragent import UserAgent
import json
import time
import pandas as pd
#下載網頁評論資料
def get_page_json(url):
try:
ua = UserAgent(verify_ssl=False)
essay-headers = {"User-Agent": ua.random}
json_comment = requests.get(url,essay-headers=essay-headers).text
return json_comment
except:
return None
#解析網頁評論資料
def parse_page_json(json_comment):
try:
comments = json.loads(json_comment)
except:
return "error"
comments_list = []
#獲取當頁資料有多少條評論(一般情況下為20條)
num = len(comments['data']['replies'])
for i in range(num):
comment = comments['data']['replies'][i]
comment_list = []
floor = comment['floor']
ctime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(comment['ctime']))#時間轉換
likes = comment['like']
author = comment['member']['uname']
sex = comment['member']['sex']
level = comment['member']['level_info']['current_level']
content = comment['content']['message'].replace('\n','')#將評論內容中的換行符去掉
#print(content)
rcount = comment['rcount']
comment_list.append(floor)
comment_list.append(ctime)
comment_list.append(likes)
comment_list.append(author)
comment_list.append(sex)
comment_list.append(level)
comment_list.append(content)
comment_list.append(rcount)
comments_list.append(comment_list)
save_to_csv(comments_list)
def save_to_csv(comments_list):
data = pd.DataFrame(comments_list)
#註意儲存檔案的編碼為utf_8_sig,不然會亂碼,後期會單獨深入講講為何為這樣(如果為utf-8)
data.to_csv('春晚鬼畜_1.csv', mode='a', index=False, sep=',', essay-header=False,encoding='utf_8_sig')
def main():
base_url = "https://api.bilibili.com/x/v2/reply?&type;=1&oid;=19390801&pn;=1"
#透過首頁獲取評論總頁數
pages = int(json.loads(get_page_json(base_url))['data']['page']['count'])//20
for page in range(pages):
url = "https://api.bilibili.com/x/v2/reply?&type;=1&oid;=19390801&pn;="+str(page)
json_comment = get_page_json(url)
parse_page_json(json_comment)
print("正在儲存第%d頁" % int(page+1))
if page%20 == 0:
time.sleep(5)
main()
其中主要涉及到兩個知識點:
1. 透過fake_useragent生成隨機UserAgent
不管是做開發還是做過網站的朋友們,應該對於User Agent一點都不陌生,User Agent 中文名為使用者代理,簡稱 UA,它是一個特殊字串頭,使得伺服器能夠識別客戶使用的作業系統及版本、CPU 型別、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器外掛等。
透過UA來判斷不同的裝置或者瀏覽器是開發者最常用的方式方法,這個也是對於Python反爬的一種策略,但是有盾就有矛啊—我的矛就是讓抓取行為和使用者訪問網站的真實行為儘量一致。
忽略ssl驗證:
ua = UserAgent(verify_ssl=False)
2. Chrome控制臺中Network的Preview的正確用法
Response:
Preview:
一般情況下我們看Network裡面的Preview和Response的結果似乎一模一樣。不管是請求頁面,請求頁面還是請求js還是請求css,二者的結果都一樣。直到今天從伺服器端向web前端傳送一段json格式的資料,才發現Preview的特殊功效。
在Preview(預覽功能)中,控制檯會把傳送過來的json資料自動轉換成javascript的物件格式。而且可以層層展開,方便前端工程師遍歷呼叫(特別是在多維的情況下),也方便我們Python爬蟲工程師解析JSON資料。
02 資料清洗預覽
由於我們在解析資料時已經將資料處理過,因此下載存為的資料已經乾凈,沒有雜亂資訊。戀習Python從中整理出Top10評論:
從上述評論中也可看出,第三、第四評論內容都是與春晚有關,也可以看出網友對本山大叔回歸春晚的期待。看著影片,一句“改革春風吹滿地”,迴蕩在腦海中幾天都揮之不去。心裡默唸著:本山大叔要是能上春晚,該多好啊!
備註:由於篇幅過長,具體分析就不詳講了,分析思路可參考之前文章:Python爬取數萬條北京租房資料,從6個維度告訴你房租瘋漲的秘密!
03 後記
在經過全民的參與和發酵過後,各種版本一應而出,尤其是英文版,押韻之餘無人能敵!
我只想借這首鬼畜歌曲,回憶一下本山大叔曾經帶給我們的歡樂,尤其是那些郎朗上口的臺詞。文章的最後我想用一句話總結一下,那就是——“我十分想念趙本山!”
你們期待有趙本山的春晚嗎?
我們正在繪製一份大資料粉絲畫像——
2019大資料粉絲有獎調查問捲上線了
歡迎長按二維碼填寫
我們每週一將從參與者中
隨機抽取3名幸運小夥伴
每位將獲贈近期出版的技術類圖書1本
Q: 今年春晚,誰最讓你期待?
歡迎留言與大家分享
覺得不錯,請把這篇文章分享給你的朋友
轉載 / 投稿請聯絡:baiyu@hzbook.com
更多精彩,請在後臺點選“歷史文章”檢視