11.28 Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

前言

文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。

作者: Yura不說數據說 ,PYuraL

PS:如有需要Python學習資料的小夥伴可以加點擊下方鏈接自行獲取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

數據爬取

其實我一開始是想用豆瓣網的評論的,但是我翻了翻吧,發現“最熱評論”只能看到500條,“最新評論”只能顯示100條,拿600條數據能分析出個啥?

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

百度了一下,看大家都是用貓眼評論,於是就……爬貓眼!網頁版的貓眼只能顯示有限的評論,切換到APP版本才能看到所有評論。

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

找network裡面的網頁也不難,隨便拿一條評論搜索一下就可以找到

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

關鍵是找到不同網頁之間的變化規律

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

有些網址,表面看上去,區別就是在於offset(偏移量),但是實際上更改這個數值到1005的時候就爬不到東西了(可能是由於網頁內部的設置吧),就是說這麼下去我們只能得到1000條評論。

那是哪1000條評論呢?我們看到網址中有個關鍵詞“ts=1549640420581”,其實就是當前時間的意思(時間戳),轉化一下就是:

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

所以1000條就是從這個時間點,往前偏移15條後,最新的1000條評論。

通過百度各位大神的爬蟲過程,我發現終極解決方法就是更改ts的值!如果說偏移量15的意思是從這個查詢的時間往前偏移15條再取得15條評論數據(limit=15),那麼我們每次更改ts值不就可以了。

第一個ts值是程序開始運行的時間,第二個值就從已經獲取的評論數據中拿到最早的那個數據,以此不斷往前翻滾……

我爬取了2月8日24點之前的所有評論信息,按App顯示此時至少有80000+條數據,但是我爬下來總共只有4w+條…數據缺失還是比較嚴重的。

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

數據格式如下(包括用戶id、用戶暱稱、用戶貓眼等級、性別、時間、評分、評論內容、點贊數和評論數):

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

這些都是在json裡面,格式非常清晰明瞭。

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

數據清洗

拿到數據除了做詞雲用了Python(代碼在最後),其他的內容Excel分分鐘解決,這裡尤其感謝發明“數據透視表”的兄弟。

數據分析

1.觀眾信息

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

男女比例各佔一半,男的對賽車這類刺激性東西感興趣可以理解,這女觀眾都是為了啥?為了黃景瑜小哥哥的臉?還是像我一樣衝著阿信來的?這裡信息太少,我只做少量胡思亂猜。

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

用戶等級又是類似於正態分佈的形狀,巧的嘞……其中0分和1分的用戶(可以認定為新註冊用戶)僅佔9.78%,可以看出評分的人中水軍是很少的,基本都是貓眼老用戶。

再看看4天用戶評價數量的變化:

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

基本可得這部電影熱度呈現緩慢下降的趨勢(但是由於數據的不完整性,不能絕對說明)

那用戶都喜歡在什麼時間評論呢?對比看四天的評論hour數據:

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

如果大家習慣看完電影馬上評價的話,那麼從評論趨勢來看,從中午12點之後評論數逐漸增加,推測是由於早上10點左右那場電影的結束。隨後評論數不斷增加,在晚飯前的5、6點和睡覺前的23點左右達到小高峰。

嗯,非常符合大家“醒了看電影,看完吃飯,吃了再看,看了再睡‘的“節假日生活作息”。

2.評分情況

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

按照我爬取的數據我們看到超過一半(52.37%)的觀眾給這部電影打了滿分10分,極少量用戶評分在6分以下(僅佔7.58%)。根據我爬取的數據,計算所得平均分是8.725,和實時顯示的分數8.8相差不大。

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

除了從宏觀角度看評分,我們來瞧瞧評論者性別和評論時間與最終評分有什麼不能說的秘密?

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

性別的不同並沒有造成評分很大的區別,男觀眾和女觀眾的評分平均分僅僅相差0.35分,“未知性別”人群的評分在兩者之間,基本等於男性評分8.53和女性評分8.88的的平均值(8.71)。嗯,我很有理由懷疑“未知人群”中男女比例也各佔一半!

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

從評分時間和評分的關係來看,低分一般出現在0點到7點之間,我猜吧,大概是在這種夜深人靜的時候,大家的情緒容易有大起大落,白天看完電影時的興奮已經退去,留下的只有深深的思考,或許還帶點批判性,吧。

3.評論內容

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

我們發現前5條評論評分均為10分:其中第一條,emmm,與電影無關,暫時跳過……其他幾條都是讚美韓寒、沈騰和黃景瑜的。

那通過詞雲具體看一下評論內容:

Python爬取貓眼電影《飛馳人生》4萬多條評論並對其進行數據分析

不成熟的代碼

from bs4 import BeautifulSoup
import requests
import warnings
import re
from datetime import datetime
import jso
headers = {
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
'Connection':'keep-alive'}
cookies={'cookie':'_lxsdk_cuid=168c325f322c8-0156d0257eb33d-10326653-13c680-168c325f323c8; uuid_n_v=v1; iuuid=30E9F9E02A1911E9947B6716B6E91453A6754AA9248F40F39FBA1FD0A2AD9B42; webp=true; ci=191%2C%E5%8F%B0%E5%B7%9E; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; __mta=49658649.1549462270794.1549465778684.1549548206227.3; _lxsdk=30E9F9E02A1911E9947B6716B6E91453A6754AA9248F40F39FBA1FD0A2AD9B42; _lxsdk_s=168c898414e-035-f0e-e6%7C%7C463'}


#url設置offset偏移量為0
url = 'http://m.maoyan.com/review/v2/comments.json?movieId=1218091&userId=-1&offset=0&limit=15&ts={}&type=3'

comment=[]
nick=[]
score=[]
comment_time=[]
gender=[]
userlevel=[]
userid=[]
upcount=[]
replycount=[]
ji=1


url_time=url_time=int(time.time())*1000#獲取當前時間(單位是毫秒,所以要✖️1000)

for i in range(2000):
value=15*i
url_range=url.format(url_time)
res=requests.get(url_range,headers=headers,cookies=cookies,timeout=10)
res.encoding='utf-8'
print('正在爬取第'+str(ji)+'頁')
content=json.loads(res.text,encoding='utf-8')
list_=content['data']['comments']
count=0
for item in list_:
comment.append(item['content'])
nick.append(item['nick'])
score.append(item['score'])
comment_time.append(datetime.datetime.fromtimestamp(int(item['time']/1000)))
gender.append(item['gender'])
userlevel.append(item['userLevel'])
userid.append(item['userId'])
upcount.append(item['upCount'])
replycount.append(item['replyCount'])
count=count+1
if count==15:
url_time=item['time']
ji+=1
time.sleep(random.random())
print('爬取完成')
print(url_time)
result={'用戶id':userid,'用戶暱稱':nick,'用戶等級':userlevel,'性別':gender,'時間':comment_time,'評分':score,'評論內容':comment,'點贊':upcount,'評論':replycount}

results=pd.DataFrame(result)
results.info()
results.to_excel('貓眼_飛馳人生.xlsx')


分享到:


相關文章: