從資料角度探究《前任3》為什麼這麼火爆

一隻寫程式的猿發表於2018-08-30

1.《前任3》為什麼這麼火爆

從資料角度探究《前任3》為什麼這麼火爆

截止發文時《前任3》票房15.50億,成為一匹黑馬,我習慣性的去豆瓣看了評分

從資料角度探究《前任3》為什麼這麼火爆

豆瓣上8萬多人只打出了5.8的評分,其中1星-3星佔比72.6%,那麼問題來了,在絕大多數豆瓣粉絲都認為是“爛片”的情況下,究竟是什麼讓《前任3》票房意外火爆呢?

為了更能說明問題,通過一些輿情監測軟體,我參考了一些社交圈的一些資料

  • 搜尋微信公眾號前任3相關的文章,我們可以看到相關結果2w多,總閱讀數6006w+

    從資料角度探究《前任3》為什麼這麼火爆
  • 我檢視了點贊數最多的,竟然是蕊希的推文 **<前任3>:謝謝和你愛過,也不遺憾最終錯過。**點贊數22956 閱讀量10w+,這裡為什麼用竟然,是因為我也是蕊希忠實的聽眾啊,多少個成長的夜晚,是這個電臺陪我入睡,多少個… 跑題了跑題了,此處省略一萬字

從資料角度探究《前任3》為什麼這麼火爆

點進去仔細看了一遍,這篇文章主要還是以一些經典的情感語錄和分手的撕心裂肺來引起讀者的共鳴或者是往事,蕊希的文章總是寫的很成功,因為她知道什麼樣的內容可以打動讀者的內心情感,看評論就知道了

從資料角度探究《前任3》為什麼這麼火爆

所以前任三之所以火爆的原因也許是因為:分手?畢竟“分手”是感情世界裡永不褪色的話題,也是最能觸發觀影者內心情感的話題,不過這只是我們的猜測。

作為一名程式設計師,我們當然不能只靠這些來說話,資料是最有說服力的,於是我爬取了一下豆瓣的影評。

2.採集豆瓣影評

有朋友私我說之前沒怎麼寫過使用框架採集資料的教程,回過頭想了想好像是很少使用框架去爬蟲了,最早的一篇還是Python網路爬蟲(六)- Scrapy框架戳我複習,發現突然讓自己用Scrapy還的確忘記從哪開始了,於是對著電腦開始發呆,大概度過了十分鐘的賢者時間一下子重新掌握了Scrapy的整體思路,(明明覆習了一兩個小時)。
戳我學習Scrapy
流程如下:

  • 建立一個Scrapy專案;
  • 定義提取的Item;
  • 編寫爬取網站的 spider 並提取 Item;
  • 編寫 Item Pipeline 來儲存提取到的Item(即資料)。
  • 提取資料庫資料,處理展示
  • 建立專案,終端輸入
# 建立專案
scrapy startproject douban_qrs

# 進入專案目錄
cd douban_qrs
# 建立爬蟲檔案
scrapy genspider douban https://movie.douban.com
複製程式碼
  • 專案結構(不包括後續配置)
|-- douban_qrs/                        # 專案資料夾
    |-- scrapy.cfg                     # 專案釋出配置
    |-- spiders/                       # 專案模組儲存了實際的爬蟲程式碼
        |-- __init__.py                # 模組描述檔案
        |-- items.py                   # 定義了待抓取域的模型
        |-- pipelines.py               # 專案pipelines定義檔案
        |-- settings.py                # 專案全域性配置,定義了一些設定,如使用者代理、爬取延時等。
        |-- spiders/                   # 爬蟲模組<開發>
            |-- __init__.py            # 模組描述檔案
            |-- douban.py              # 爬蟲程式碼
複製程式碼

難題:scrapy實現模擬登入
這裡我又重新去翻了一遍文件,發現文件中是有描述的
參考文件

  • scrapy中cookies的寫法,可以與request中cookie的寫法對比下
從資料角度探究《前任3》為什麼這麼火爆

這裡我用了兩種方法解決這個問題,第一個是加cookie,效果不太理想,我換了第二種採用登入的方式。

  • 由於在登入過程中可能需要輸入驗證碼,目前採用把驗證碼圖片儲存至本地手動輸入
    (藉助一些打碼平臺可以實現自動識別驗證碼輸入,收費)
    def logged_in(self, response):
        img_code = response.xpath("//img[@id=`captcha_image`]/@src").extract()
        if len(img_code) > 0:
            print("請輸入驗證碼登入")
            localpath = "/home/xsl/imgcode.jpg"
            # 將圖片下載到本地
            urllib.request.urlretrieve(img_code[0], filename=localpath)
            print("請檢視本地驗證碼圖片並輸入驗證碼")
            img_code_value = input()
            data = {
                "form_email": "你的賬號",
                "form_password": "您的密碼",
                "captcha-solution": str(img_code_value),
            }

        else:
            print("此時沒有驗證碼")
            data = {
                "form_email": "你的賬號",
                "form_password": "您的密碼",
            }
        print("登入中.(ง •̀_•́)ง")
        return [scrapy.FormRequest(`https://www.douban.com/login`,
                                   formdata=data,
                                   callback=self.movie)]
複製程式碼

3.詞雲和分佈圖展示

def word_cloud(comment):
    logger.info(`製作詞雲圖...word_cloud`)
    comment_text = ``
    back_coloring = imread("static/zzb.jpg")
    cloud = WordCloud(font_path=`static/simhei.ttf`,  # 若是有中文的話,這句程式碼必須新增,不然會出現方框,不出現漢字
                      background_color="white",  # 背景顏色
                      max_words=2000,  # 詞雲顯示的最大詞數
                      mask=back_coloring,  # 設定背景圖片
                      max_font_size=100,  # 字型最大值
                      random_state=42,
                      width=360, height=591, margin=2,  # 設定圖片預設的大小,但是如果使用背景圖片的話,那麼儲存的圖片大小將會按照其大小儲存,margin為詞語邊緣距離
                      )
    for li in comment:
        comment_text += ` `.join(jieba.cut(li, cut_all=False))
    wc = cloud.generate(comment_text)
    image_colors = ImageColorGenerator(back_coloring)
    plt.figure("wordc")
    plt.imshow(wc.recolor(color_func=image_colors))
    wc.to_file(`前任三詞雲圖.png`)


def snowlp_analysis(comment):
    logger.info(`自然語言處理NLP...snow_analysis`)
    sentimentslist = []
    for li in comment:
        s = SnowNLP(li)
        # logger.debug(li)
        # logger.debug(li, s.sentiments)
        print(li, s.sentiments)
        sentimentslist.append(s.sentiments)
    fig1 = plt.figure("sentiment")
    plt.hist(sentimentslist, bins=np.arange(0, 1, 0.02))
    plt.show()
複製程式碼

本來是想用至尊寶做一個詞雲圖的,找了好久沒找到素材,就用了之前我的一張桌布

從資料角度探究《前任3》為什麼這麼火爆
從資料角度探究《前任3》為什麼這麼火爆

話說,詞雲圖好像並不能看出什麼~而分佈圖表達的結果也並不直觀,那就代表本次的結果沒有什麼卵用,個人覺得是因為資料量太小了,而且詞雲圖本身對資料展示的結果只能看出高頻詞而已…我就不分析什麼了(我真的盡力了(ง •̀_•́)ง)
我也想像其他大佬一樣機器學習,資料分析啊

原始碼已上傳Github
時光無法回頭,人生也不能重來,珍惜眼前人。

相關文章