趙本山:我的時代還沒有結束 | Python告訴你

AI科技大本營發表於2019-02-09

640?wx_fmt=png

作者 | 丁彥軍

來源 | 戀習Python(ID:  sldata2017)

【AI科技大本營按】今年春晚的小品好看嗎?沒有了趙本山的春晚總覺得少了點什麼,然而許久不登春晚舞臺的本山大叔藉著B站的東風證明了「你大爺還是你大爺」。


最近很多人被“改革春風吹滿地, 中國人民真爭氣”魔性的旋律所洗腦,實際上這段魔性的旋律來自於鬼畜神曲《唸詩之王》,而這段神曲就是根據本山大叔的作品所剪輯的。目前《唸詩之王》在B站播放量已經接近3000萬!今天我們就來用Python分析下《唸詩之王》火起來的原因。


1990年本山老師首次登上中央電視臺春節聯歡晚會舞臺,在春晚舞臺給我們留下很多深入人心的作品如《相親》,《我想有個家》,《昨天今天明天》,到2011年最後一次在春晚舞臺表演小品,,22個年頭陪我們度過了21個大年夜,每次都期待大叔的壓軸出場伴隨著零點的鐘聲一起跨年。


640?wx_fmt=jpeg


20年裡本山老師的影響力是毋庸置疑的,但是小平不是單口相聲更不是獨角戲,他的成功也是離不開搭檔的配合,大家最熟悉的搭檔應該是範偉何高秀敏。三個人作為黃金搭檔也是演繹了許多經典作品比如《賣柺》,《買車》,《功夫》等。


640?wx_fmt=jpeg


除了範偉和高秀敏,最令人印象深刻的搭檔就是宋丹丹了,雖然合作的不是特別多但是二人合作的《昨天今天明天》和《小崔說事》太深入人心,白雲黑土成了大家最喜愛的大叔大媽但宋丹丹多次說過上春晚太累,短期應該不會在合作了吧。


640?wx_fmt=jpeg


最近你有沒有被“改革春風吹滿地, 中國人民真爭氣”魔性的旋律所洗腦?這段視訊一經發布,就迅速攻佔“快手”“抖音”等各大短視訊平臺,近日臨近春節,彷彿又開始爆發,儼然已經從2018年末火到了2019年初。



恐怕連趙本山本人也不敢相信,自己這麼多年演的小品,被人剪輯改變成鬼畜神曲《唸詩之王》後,這些經典臺詞煥發了第二春。《唸詩之王》在B站播放量高達2400萬,本山大叔,即便已經七八年沒上春晚了,依然是毋庸置疑的高人氣IP!


接下來,戀習Python通過Python大法通過獲取B站:【春晚鬼畜】趙本山:我就是念詩之王!(https://www.bilibili.com/video/av19390801/)4萬條資料評論,與大家一起看看其背後火起來的原因。


還是老規矩,老套路(是不是有股熟悉的味道),戀習Python常用的三部曲:資料獲取、資料清洗預覽、資料分析視覺化。


一、資料獲取


在獲取視訊評論之前,我們首要做的就是分析其網頁結構,尋找目標資料(也就是我們要的評論資料在哪裡,這點很重要)


640?wx_fmt=png


640?wx_fmt=png


最終發現,目標資料的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個維度,如下:

640?wx_fmt=jpeg


詳細程式碼:

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)
        headers = {"User-Agent": ua.random}
        json_comment = requests.get(url,headers=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=',', 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:

640?wx_fmt=png


Preview:

640?wx_fmt=png


一般情況下我們看Network裡面的Preview和Response的結果似乎一模一樣。不管是請求頁面,請求頁面還是請求js還是請求css,二者的結果都一樣。直到今天從伺服器端向web前端傳送一段json格式的資料,才發現Preview的特殊功效。在Preview(預覽功能)中,控制檯會把傳送過來的json資料自動轉換成javascript的物件格式。而且可以層層展開,方便前端工程師遍歷呼叫(特別是在多維的情況下),也方便我們Python爬蟲工程師解析JSON資料。


二、資料清洗預覽


由於我們在解析資料時已經將資料處理過,因此下載存為的資料已經乾淨,沒有雜亂資訊。戀習Python從中整理出Top10評論:


640?wx_fmt=png


從上述評論中也可看出,第三、第四評論內容都是與春晚有關,也可以看出網友對本山大叔迴歸春晚的期待。看著視訊,一句“改革春風吹滿地”,迴盪在腦海中幾天都揮之不去。心裡默唸著:本山大叔要是能上春晚,該多好啊!


三、後記


在經過全民的參與和發酵過後,各種版本一應而出,尤其是英文版,押韻之餘無人能敵!



我只想借這首鬼畜歌曲,回憶一下本山大叔曾經帶給我們的歡樂,尤其是那些郎朗上口的臺詞。文章的最後我想用一句話總結一下,那就是——“我十分想念趙本山!”


(本文為AI科技大本營轉載文章,轉載請聯絡作者。)


徵稿


640?wx_fmt=png


推薦閱讀:

點選“閱讀原文”,開啟CSDN APP 閱讀更貼心!

相關文章