反貪風暴4-貓眼影評從爬取到可視化
阿新 • • 發佈:2019-04-30
ffffff 而且 hidden pro 請求 -a nts dcloud ech
10分: 189
我感覺學習python有一個階段就是熟悉它的各種第三方庫的使用,這次我們用jieba分詞,用wordcloud生成詞雲,用pyecharts生成柱狀圖,來看看吧~
若您有需要,所有文件已上傳到我的github(左上角圖標直達)~
從爬蟲開始好了,貓眼電影電腦網頁版只能看熱門影評。其實為了獲取更多影評我們可以這樣做,瀏覽器內按f12打開開發者工具,選擇手機瀏覽模式,刷新後就會是手機版的網頁了。如圖:
然後查找接口,頁面往下拉...em...很容易就找到了,是這個 這是一個js發起的get請求,看鏈接可以知道參數有
我們偽造這一條請求就能直接獲得影評了,而且返回是json格式,甚至都不用整理數據了
爬蟲代碼:
import requests import json headers = { ‘User-Agent‘: ‘Mozilla/5.0 (Linux; Android 5.1.1; MI 6 Build/NMF26X) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/39.0.0.0 Mobile Safari/537.36 TitansX/11.14.7 KNB/1.2.0 android/5.1.1 com.sankuai.moviepro/com.sankuai.moviepro/5.4.4 App/10a20/5.4.4 com.sankuai.moviepro/5.4.4‘, } def get_one(offset): url = ‘https://m.maoyan.com/review/v2/comments.json?‘ params = { ‘movieId‘: ‘1211727‘, ‘userId‘: ‘-1‘, ‘offset‘: offset, #offset控制傳來第幾頁數據 ‘limit‘: ‘15‘, ‘ts‘: ‘0‘, ‘type‘: ‘3‘, } r = requests.get(url=url,params=params,verify=False) #verify=False為避免ssl認證,防止訪問https時報錯,這裏假設所有訪問都會正常,沒有加容錯機制。 js = json.loads(r.text) #將返回的json轉為字典類型 with open(‘fantan4.json‘,‘a‘,encoding=‘utf-8‘) as f: json.dump({"items":js[‘data‘][‘comments‘]}, f, ensure_ascii=False, sort_keys=True, indent=4) #寫獲取的所有詳情到json文件中 f.write(‘,‘) #這裏加一個‘,‘是為了之後將json文件格式改造正確所用 comments = [] for dic in js[‘data‘][‘comments‘]: comments.append(dic[‘content‘]) #這裏獲取每條影評到列表 str1 = ‘ ‘.join(comments) #影評列表轉字符串以‘ ‘分開 print(str1) with open(‘com.txt‘,‘a‘,encoding=‘utf-8‘) as f: f.write(str1) #單獨寫入影評到文件,用於詞雲的生成 for i in range(0,67): print(i) get_one(i*15)
保存的json我自己增加了一個鍵‘all’並以[]包含了所有的值,如圖:
數據都準備好了就開始畫圖啦~先用評論按詞頻生成詞雲看看吧~這是做蒙版的圖(自己扣出來的,羽化有點嚴重,請不要在意這些細節~~): 生成的詞雲: 生成詞雲的代碼:
from os import path #組織文件路徑 from PIL import Image #處理傳入的背景圖 #詞雲生成模塊 from wordcloud import WordCloud,ImageColorGenerator import matplotlib.pyplot as plt import jieba #中文分詞 import numpy as np #中文處理 import matplotlib.font_manager as fm import io import sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding=‘utf-8‘) #背景圖 bg = np.array(Image.open(‘1.jpg‘)) #獲取當前項目路徑 dir = path.dirname(__file__) #添加自定義的分詞 jieba.add_word(‘古天樂‘) jieba.add_word(‘林峰‘) jieba.add_word(‘反貪‘) #一些詞要去除,停用詞表 stopwords_path=‘stopwords.txt‘ #文本的名稱 text_path=‘com.txt‘ #讀取要分析的文本 text = open(path.join(dir,text_path),encoding=‘utf-8‘).read() #函數,用於分詞 def jiebaClearText(text): #空列表,將已經去除的停用詞的分詞保存 myWordList = [] #分詞 seg_list = jieba.cut(text,cut_all=False) #seg_list類型是generator #將每個generator的內容用/連接 listStr = ‘/‘.join(seg_list) #停用表 f_stop = open(stopwords_path,encoding=‘utf-8‘) #讀取 try: f_stop_text = f_stop.read() finally: f_stop.close() #停用詞格式化,用\n分開(因為原來文件裏一行一個停用詞),返回一列表 f_stop_seg_list = f_stop_text.split(‘\n‘) #將用‘/‘結合的內容分開並去重用於去掉停用詞 bookList=listStr.split(‘/‘) #默認模式遍歷,去掉停用詞 for myword in bookList : #去掉停用詞,邏輯:若內容不在停用詞列表且長度>1則收錄 if not ((myword.split())) in f_stop_seg_list and len(myword.strip())>1: myWordList.append(myword) return myWordList text1 = jiebaClearText(text) #計算詞頻 frequency = {} for i in text1: print(i) if i in frequency: frequency[i]+=1 else: frequency[i]=1 print(frequency) #生成 wc = WordCloud( background_color = ‘white‘, #背景色 max_words = 300, #最大顯示詞數 mask = bg, #圖片背景 min_font_size=6, # 字最大尺寸 max_font_size = 100, #字最大尺寸 random_state = 42, font_path=‘C:/Windows/Fonts/simkai.ttf‘ #字體 ).fit_words(frequency) #為圖片設置字體 my_font = fm.FontProperties(fname=‘C:/Windows/Fonts/simkai.ttf‘) #產生背景圖片,基於彩色圖像的顏色生成器 image_colors = ImageColorGenerator(bg) #畫圖 plt.imshow(wc.recolor(color_func=image_colors)) #為雲圖去掉坐標軸 plt.axis(‘off‘) #畫雲圖,顯示 plt.figure() #為背景圖去掉坐標軸 plt.axis(‘off‘) plt.imshow(bg,cmap=plt.cm.gray) #保存 wc.to_file(‘man.png‘)
最後給出pyecarts生成柱狀圖的代碼:
from pyecharts import Bar import json #用於記錄不同性別的打分 all = {0:[0,0,0,],1:[0,0,0,],2:[0,0,0,],3:[0,0,0,],4:[0,0,0,],5:[0,0,0,],6:[0,0,0,],7:[0,0,0,],8:[0,0,0,],9:[0,0,0,],10:[0,0,0,]} with open(‘fantan4.json‘,‘r‘,encoding=‘utf-8‘) as f: js = json.loads(f.read()) for i in js[‘all‘]: items = i[‘items‘] for details in items: score = details[‘score‘] #取分數 gender = details[‘gender‘] #取對應性別 all[score][gender]+=1 print(all) male,female,none = zip(all[0],all[1],all[2],all[3],all[4],all[5],all[6],all[7],all[8],all[9],all[10]) #以性別分開數據,這麽做為了將數據轉化滿足pyecharts輸入的要求 attr = [‘0分‘,‘1分‘,‘2分‘,‘3分‘,‘4分‘,‘5分‘,‘6分‘,‘7分‘,‘8分‘,‘9分‘,‘10分‘] #0為男,1為女,2為未知 bar = Bar("評分",) bar.add("男性評分", attr, male, is_stack=True) bar.add("女性評分", attr, female, is_stack=True) bar.add("未知性別評分", attr, none, is_stack=True) bar.render(‘1.html‘)
效果(鼠標放上去試試~~):
女性評分10分: 189
反貪風暴4-貓眼影評從爬取到可視化