1. 程式人生 > >大熱片《尋夢環遊記》到底在講什麼

大熱片《尋夢環遊記》到底在講什麼

最近《尋夢環遊記》刷爆朋友圈,一心只想學習的我,並沒有去看,但是還是很想知道這個電影是講的什麼。怎麼辦呢,所謂把大象放進冰箱分三步。要知道這個電影講什麼也可以分三步:
1.登陸豆瓣
2.抓取所有短評
3.利用詞雲看看大家的評論集中在哪些點,就能大概瞭解電影型別,主題,大致內容。

一、模擬登陸豆瓣

因為豆瓣有反爬蟲機制,不登入只能爬到第10頁,無法獲取更多的內容(練模擬登陸的本人,被豆瓣鎖了兩個號),本文用的post保單的方法進行登陸。

#by:大熊([email protected])

import requests
from lxml import etree
from
PIL import Image from io import BytesIO import random import pandas as pd import time import sys reload(sys) sys.setdefaultencoding('utf8') # 獲取驗證碼登陸 headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) ' 'AppleWebKit/537.36 (KHTML, like Gecko)' 'Chrome/62.0.3202.94 Safari/537.36'
} session = requests.session() login_request = session.get('https://www.douban.com/login', headers=headers) selector = etree.HTML(login_request.content) post_data = {'source': 'movie', # 填寫表單 'redir': 'https://movie.douban.com/subject/20495023/', 'form_email': '[email protected]
'
, 'form_password': '3594633abc', 'login': '登入'} captcha_img_url = selector.xpath('//img[@id="captcha_image"]/@src') # 獲取驗證碼url print captcha_img_url try: if captcha_img_url != None: pic_request = requests.get(captcha_img_url[0]) img = Image.open(BytesIO(pic_request.content)) # 開啟驗證碼圖片 print '請輸入你看到的字母:' img.show() string = raw_input('請輸入驗證碼:') post_data['captcha-solution'] = string captcha_id = selector.xpath( '//input[@name="captcha-id"]/@value') # 獲取captcha_id post_data['captcha-id'] = captcha_id print(post_data) except: pass r = session.post('https://accounts.douban.com/login', data=post_data) # 將表單資訊post進行登陸 with open('logfile.log', 'w') as logfile: logfile.write(r.text) except: pass

二、爬取短評內容

本來是抱著爬9萬條評論的心做的,結果每次爬到25頁就不能爬了,糾結了兩天,改連結改來改去都不行,後來發現豆瓣現在短評只顯示到25頁,後面就沒有了。豆瓣你狠!

r = session.post('https://accounts.douban.com/login',
                  data=post_data)  # 用session保持登陸狀態
with open('logfile.log', 'w') as logfile:
    logfile.write(r.text)

# 獲取內容
page = 0
while True:
    try:
        username = []  # 使用者姓名
        star_ratings = []  # 評級
        votecount = []  # 認為評論有用的人數
        comments = []  # 短評內容
        seetimes = []  # 評論時間
        if page==0:
            url='https://movie.douban.com/subject/20495023/comments?start=p'
        else:
            pass
        r = session.get(url)
        html = r.text

        # 解析具體內容
        selector = etree.HTML(html)  # 解析所有頁面的原始碼
        contents = selector.xpath('//div[@class="comment"]')
        nextp=selector.xpath('//div[@id="paginator"]/a/@href')
        if len(nextp)==1:
            nextpage=nextp[0]      #首頁只有表示“後頁”的一個href
        elif len(nextp)==2:
            nextpage="?default"    #末頁有表示“首頁”和“前頁”的兩個href
        else:
            nextpage=nextp[2]      #中間頁有表示“首頁”、“前頁”、“末頁”的三個href
        for content in contents:
            user = content.xpath('.//h3/span[2]/a/text()')[0]  # 使用者名稱
            print user
            words = content.xpath('.//p/text()')[0].strip()
            star_rating = content.xpath('.//h3/span[2]/span[2]/@class')[0][7:8]
            vote = content.xpath('.//h3/span[1]/span/text()')[0]
            seetime = content.xpath('//h3/span[2]/span[3]/text()')[0]
            username.append(user)
            comments.append(words)
            star_ratings.append(star_rating)
            votecount.append(vote)
            seetimes.append(seetime)
        shortcom = {"username": username, "star_ratings": star_ratings,
                    "votecount": votecount, "comment": comments,
                    "seetimes": seetimes}
        houses_df = pd.DataFrame(shortcom)
        page += 1
        if page == 1:
            houses_df.to_csv('dbmvtest.csv', encoding="utf8")  # 寫入第一頁
        else:
            houses_df.to_csv('dbmvtest.csv', encoding="utf8", mode='a',
                             header=False)  # 追加下一頁

        print '.................正在抓取第' + '%d' % (page) + '頁'
        url='https://movie.douban.com/subject/20495023/comments'+nextpage
        time.sleep(random.uniform(1, 3))  # 間隔1-3秒抓一

於是,抓到如下評論:
這裡寫圖片描述

三、生成詞雲

本來用datafram生成一些表格看上映期間每天評論數的表格,和做情感分析,但是資料有限就只做了詞雲。因為豆瓣短評是以評論熱度(認為此評論有用的人數)來排序顯示的,前25頁評論基本能反映觀眾對電影的解讀。

#coding=utf-8
from scipy.misc import imread
from os import path
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS,ImageColorGenerator
import csv

#從CVS中讀取短評所在列的內容
def readcontent(csv):
    with open('dbmvtest.csv','rb')as csvfile:
        reader=csv.DictReader(csvfile)
        column=[row['comment']for row in reader]   #載入表頭為"comment"的列,即短評內容
        content="".join(column)
        return content

def creatcloud(mvcontent):
    wordafterjieba=jieba.cut(mvcontent,cut_all=False)    #分詞
    wordsplit="".join(wordafterjieba)
    BGI=imread('./coco.jpg')
    print "載入圖片成功"

    #設定詞雲樣式
    wc=WordCloud(width=1024,
                 height=768,
                 background_color="white",   #設定背景顏色
                 mask=BGI,
                 font_path='SourceHanSansCN-Normal.otf',  #設定字型
                 max_words=300
                 max_font_size=400,      #設定字型最大值
                 random_state=50)
    wc.generate_from_text(wordsplit)
    img_colors=ImageColorGenerator(BGI)
    wc.recolor(color_func=img_colors)    #設定字型顏色為背景圖片顏色
      plt.imshow(wc)
    plt.axis("off")
    plt.show()
    return wc

if __name__ == '__main__':
    comment=readcontent(csv)
    pic=creatcloud(comment)
    d = path.dirname(__file__)     #獲取當前檔案路徑
    pic.to_file(path.join(d,"dreamcloud.jpg"))
    print "..........已生成詞雲.........."

最終生成了如下詞雲:

這裡寫圖片描述

從詞語中能看到好幾部動畫片的名稱《頭腦特工隊》、《殭屍新娘》、《飛屋環遊記》等等,裡面我就看過殭屍新娘,哈哈,不過能和殭屍新娘相提並論,這部電影很ok。“夢想”、“家庭”、“墨西哥亡靈節”、“remember”、“死亡並不可怕”都是被提及很多的詞,應該是電影的主題。

後來發現好像不對,哈哈,沒把句子切開,切開後重新生成時下面這樣的:

這裡寫圖片描述