作業要求來自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3075
上個星期去看了電影《反貪風暴》,該片講述了ICAC陸志廉卧底獄中,與獄中兩大勢力斗智斗力,調查取證罪犯與監獄懲教員私相授受的案件,最終引出並成功破獲大案的故事。
對電影中的有些畫面印象很是深刻,給了一個滿分評價。但在復聯的壓力之下只能頂着票房第二的位置。
在我獲取數據的時候票房已經是7.65億元,評分9.1。於是我爬取了69406條評論,對評論進行分析電影。
獲取數據部分:
然后往下滑,點擊右邊界面的XHR就發現會出現一個評論文件,我們可以查看里面的數據,每一次滑到底AJAX都會有新的文件,里面包含15條數據。
但是得到的數據是這樣的,里面顯示的數據包含了:id,評價內容content,評分score,時間time,名字nick。所以如果使用這個數據接口的話我們需要對時間time進行解析,並且只能獲取前1
於是根據資料使用抓包工具,找到了另外一個數據接口:
http://m.maoyan.com/mmdb/comments/movie/1211727.json?_v_=yes&offset=0&startTime=0
每次發起請求時 服務器返回的都是JSON格式,每次都會有15條數據,數據返回結構如圖所示,我們需要的數據為
- 評論內容:content
- 所在城市:cityName
- 用戶id:id
- 電影評分:score
- 評論時間:starttime
這樣的話我們的評論數據接口已經得到了,接下來就是對數據進行大量獲取了。
獲取數據 def get_data(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36', 'User-Agent': 'Mozilla / 5.0(Linux;Android 6.0; Nexus 5 Build / MRA58N) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 73.0 .3683.103Mobile Safari / 537.36', 'User-Agent': 'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10' } proxies = { "http": " http://10.10.1.10:3128", "https": " http://10.10.1.10:1080", } req = request.Request(url, headers=headers[random.randint(0.2)]) response = request.urlopen(req) if response.getcode() == 200: return response.read() return None
對數據進行處理:
def parse_data(html): data = json.loads(html)['cmts'] # 將str轉換為json comments = [] for item in data: comment = { 'id': item['id'], 'nickName': item['nickName'], 'cityName': item['cityName'] if 'cityName' in item else '', # 處理cityName不存在的情況 'content': item['content'].replace('\n', ' ', 10), # 處理評論內容換行的情況 'score': item['score'], 'startTime': item['startTime'] } comments.append(comment) return comments
對數據進行保存:
#保存到csv文件 for item in comments: with open('D:\h.csv', 'a', encoding='utf-8') as f: f.write(str(item['id']) + ',' + item['nickName'] + ',' + item['cityName'] + ',' + item[ 'content'] + ',' + str(item['score']) + ',' + item['startTime'] + '\n') #保存到數據庫中 conInfo = "mysql+pymysql://user:passwd@host:port/movie?charset=utf8" engine = create_engine(conInfo,encoding='utf-8') df = pd.DataFrame(allnews) df.to_sql(name = ‘movie', con = engine, if_exists = 'append', index = False)
所以最后從中爬取69406條評論
數據的可視化結果:(Pyecharts)
注意:得到數據之后要先對數據進行清洗和預處理再進行數據的統計分析
1.觀眾位置分布:
由圖可知,《反貪風暴》的觀眾位置分布相對比較集中在沿海地區,沿海城市的城市相對比較發達,點的顏色也差不多,只有較少個顏色比較突出,代表着人很多的城市所在。
代碼:
import pandas as pd from collections import Counter from pyecharts import Map, Geo, Bar def draw_map(comments): try: attr = comments['cityName'].fillna("zero_token") data = Counter(attr).most_common(300) data.remove(data[data.index([(i, x) for i, x in (data) if i == 'zero_token'][0])]) geo = Geo("《反貪風暴》觀眾位置分布", "數據來源:貓眼電影", title_color="#fff", title_pos="center", width=1000, height=600, background_color='#404a59') attr, value = geo.cast(data) geo.add("", attr, value, visual_range=[0, 1000], maptype='china', visual_text_color="#fff", symbol_size=10, is_visualmap=True) geo.render("./觀眾位置分布.html") # 生成html文件 geo # 直接在notebook中顯示 except Exception as e: print(e) if __name__ == "__main__": filename = "D:\aa.csv" titles = ['nickName','cityName','content','score','startTime'] comments = pd.read_csv(filename, names=titles, encoding='gbk') draw_map(comments):
2.粉絲來源排行top20城市
由此我們進一步,對觀眾所在的城市進行分析。
可以看出,粉絲來源排名前20的城市為:廣州、深圳、上海ia、東莞、成都、北京、武漢、佛山、重慶、長沙、中山、南京、西安、順德、天津、杭州、鄭州、沈陽、南寧、長春。
可以發現幾乎都是經濟相對發達的城市,可以看得出這些城市的消費水平更高,民眾對第三行業的消費有更多是選擇,城市的GDP也逐漸上升。
代碼:(本人的數據是直接再excel上統計得到了,也可以使用代碼進行統計)
# -*- coding:utf-8 -*- from pyecharts import Map, Geo, Bar data_top30=[ (u"廣州", 3980), (u"深圳", 3599), (u"上海",3082 ), (u"東莞", 2597), (u"成都", 1877), (u"北京", 1736), (u"武漢", 1534), (u"佛山", 1533), (u"重慶", 1235), (u"長沙", 1083), (u"中山", 1078), (u"南京", 990), (u"西安", 825), (u"順德", 782), (u"天津", 697), (u"杭州", 691), (u"鄭州", 678), (u"沈陽", 663), (u"南寧", 662), (u"長春", 585),] bar = Bar("《反貪風暴》粉絲來源排行TOP20城市", "數據來源:貓眼電影", title_pos='center', width=1200, height=600) attr, value = bar.cast(data_top30) bar.add("", attr, value, is_visualmap=True, visual_range=[0, 5000], visual_text_color='#fff', is_more_utils=True, is_label_show=True) bar.render("./粉絲來源排行-柱狀圖.html")
3.詞雲圖:
- 評論中多次出現“可以”、“好看”、“不錯”,“非常”等好評詞,說明觀眾還是還是很喜歡《反貪風暴4》的。
- 可以看到很多“古天樂”,“校長”的詞語,說明有一些觀眾是古天樂的頭號粉絲,對古天樂的演技表示認可。
- 也有部分觀眾表示失望,那這個原因估計是因為對劇情的期待太高了導致有落差吧。
# coding=utf-8 # 導入jieba模塊,用於中文分詞 import jieba # 導入matplotlib,用於生成2D圖形 import matplotlib.pyplot as plt # 導入wordcount,用於制作詞雲圖 from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator # 獲取所有評論 comments = [] with open('comments.txt', mode='r', encoding='utf-8') as f: rows = f.readlines() for row in rows: comment = row.split(',')[3] if comment != '': comments.append(comment) # 設置分詞 comment_after_split = jieba.cut(str(comments), cut_all=False) # 非全模式分詞,cut_all=false words = " ".join(comment_after_split) # 以空格進行拼接 # print(words) # 設置屏蔽詞 stopwords = STOPWORDS.copy() stopwords.add("電影") stopwords.add("一部") stopwords.add("一個") stopwords.add("沒有") stopwords.add("什么") stopwords.add("有點") stopwords.add("這部") stopwords.add("這個") stopwords.add("不是") stopwords.add("真的") stopwords.add("感覺") stopwords.add("覺得") stopwords.add("還是") stopwords.add("但是") stopwords.add("就是") # 導入背景圖 bg_image = plt.imread('bg.jpg') # 設置詞雲參數,參數分別表示:畫布寬高、背景顏色、背景圖形狀、字體、屏蔽詞、最大詞的字體大小 wc = WordCloud(width=1024, height=768, background_color='white', mask=bg_image, font_path='STKAITI.TTF', stopwords=stopwords, max_font_size=400, random_state=50) # 將分詞后數據傳入雲圖 wc.generate_from_text(words) plt.imshow(wc) plt.axis('off') # 不顯示坐標軸 plt.show() # 保存結果到本地 wc.to_file('詞雲圖.jpg')

from pyecharts import Pie attr = ['五星','四星','三星','二星','一星'] value= [15170,9443,2891,762,1533] pie = Pie('《反貪風暴》評分星級比例', title_pos='center', width=900) pie.add("7-17", attr, value, center=[75, 50], is_random=True, radius=[30, 75], rosetype='area', is_legend_show=False, is_label_show=True) pie.render('./觀眾評分星級.html')
