一、專案背景
電影逐漸成為人們生活的不可或缺的一部分,而瞭解一部電影的可以透過電影評分與大眾推薦度,但以上的方式都太過於片面,瞭解一部電影的方法是透過已經觀看完電影的人群的反饋,雖然電影評分和大眾推薦度在一定程度上是觀影人群的反饋,但是並沒有電影評論的反饋真實。評論對影視劇的好壞與特色可以更加充分的體現。所以瞭解一部影視作品的最好方式是透過評論。出於對評論的大量且參差不齊的考慮,通過出現的高頻詞來分析,是透過評論瞭解影視劇較為便捷的方式。將高頻詞整合,透過詞雲圖是極好的方式。所以專案基於以上背景決定基於網路爬蟲獲取豆瓣評論生成詞雲圖實現指定電影豆瓣評論關鍵詞詞雲生成器。
二、專案的詳細設計生成器的主要結構為,爬蟲模組、詞雲生成模組、GUI介面模組。主要流程為在GUI輸入電影名稱後,將引數傳給爬蟲模組,具體透過get方式將電影名稱封裝成url傳送至豆瓣伺服器進入搜尋介面獲取指定電影URL中指定的id,將獲取的id再次封裝成url傳送至豆瓣伺服器進入評論網頁,透過爬蟲爬取評論資料存至本地生成文字格式。生成本地文字後,程式將呼叫詞雲模組對生成的文字提取,並進行符號刪除並且刪去停用詞。並定位背景圖以及設定圖片詞語引數生成詞雲圖返回。考慮到人工收集影評較為複雜且工作量繁重,故透過網路爬蟲實現對指定豆瓣評論的爬取。爬取物件為豆瓣影評取,且需要考慮輸入電影名字爬取指定的功能,所以選用的庫函式有:requests、urllib.request、Beautifulsoup、用於爬取評論資料及獲取。將電影名稱封裝url傳送後,進入搜尋介面,使用Xpath定位HTML程式碼中的搜尋結果的第一項中的sid。將獲取到的的id構造url傳送給豆瓣伺服器,訪問評論網頁。進入網站後,呼叫定義函式getComment()對評論進行爬取,並儲存至本地文字中。 後續透過詞雲處理後生成詞雲圖展示。爬蟲模組以上為爬蟲工作所有需要呼叫的包import urllib.requestimport requests, refrom bs4 import BeautifulSoup
獲取HTML原始碼
def getHtml(url): """獲取url頁面""" headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'} req = urllib.request.Request(url,headers=headers) req = urllib.request.urlopen(req) content = req.read().decode('utf-8') return content
這部分程式碼用於將獲取後的HTML原始碼處理並提取出指定內容。
def getComment(url): """解析HTML頁面""" html = getHtml(url) soupComment = BeautifulSoup(html, 'html.parser') comments = soupComment.findAll('span', 'short') onePageComments = [] for comment in comments: # print(comment.getText()+'\n') onePageComments.append(comment.getText()+'\n') return onePageComments
在搜尋頁面內定位第一個展示的電影對應的sid(即為豆瓣網裡每一部電影唯一的id)def getid(name): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', } movie_name = name params = { "q": movie_name } search_url = "https://www.douban.com/search" r = requests.get(search_url, params=params, headers=headers) soup = BeautifulSoup(r.content, 'lxml') first_movie_info = soup.find('a', {'class': 'nbg'})['onclick'] pattern = re.compile('\d{4,}') sid = str(pattern.search(first_movie_info).group()) return(sid)
將上一個函式返回的結果進行評論提取並存入txt文字
def get_data(): with open('電影評論.txt', 'w', encoding='utf-8') as f: sid=getid(_input.get()) for page in range(10): # 豆瓣爬取多頁評論需要驗證。 url = 'https://movie.douban.com/subject/'+sid+'/comments?start=' + str(20*page) + '&limit=20&sort=new_score&status=P' for i in getComment(url): f.write(i)
GUI模組GUI模組呼叫的庫from tkinter import *import matplotlib.pyplot as pltapp = Tk()#主視窗_input = Entry()#輸入框_input.pack()app.title("電影評論關鍵詞生成器")screenwidth = app.winfo_screenwidth()#定義視窗寬度screenheight = app.winfo_screenheight()#定義視窗高度dialog_width = 400dialog_height = 170# 前兩個引數是視窗的大小,後面兩個引數是視窗的位置app.geometry( "%dx%d+%d+%d" % (dialog_width, dialog_height, (screenwidth - dialog_width) / 2, (screenheight - dialog_height) / 2))#設定視窗局中分佈btn = Button(text='查詢', command=get_data,width=10)#定義按鈕,按鈕的結果是呼叫get data函式進入爬蟲模組btn.place(x=155, y=80)#定義按鈕位置btn.pack()app.mainloop()
詞雲模組詞雲模組呼叫的庫
from wordcloud import WordCloudimport pandas as pdfrom imageio import imreadimport jiebawith open("電影評論.txt", "r", encoding='UTF-8') as fin1: all_words = cut_words(fin1)#讀取文字 #定義停用詞 stop = ['的','你','了','將','為','例',' ','多','再','有','是','等','天','次','讓','在','我','也','就','這樣','啊','和','都','《','》',',','看','!','什麼','怎麼','這麼','很','給','沒有','不是','說' ,'不','嗎','?','!' ,'?','。' ,'...' ,'電影','主','男','女' ] words_cut = []#定義停用詞 for word in all_words: if word not in stop: words_cut.append(word) word_count = pd.Series(words_cut).value_counts() back_ground = imread("F:\\flower.jpg")#自己定義圖片位置 wc = WordCloud( font_path="C:\\Windows\\Fonts\\simhei.ttf", #設定字型 background_color="white", #設定詞雲背景顏色 max_words=400, #詞雲允許最大詞彙數 mask=back_ground, #詞雲形狀 max_font_size=400, #最大字型大小 random_state=90 #配色方案的種數 ) wc1 = wc.fit_words(word_count) #生成詞雲 plt.figure() plt.imshow(wc1) plt.axis("off") plt.show() wc.to_file("ciyun.png")
三、專案的分析與測試介面如下: 輸入電影名稱(採用《八佰》作為示例)
返回結果:
全部程式碼from tkinter import *import urllib.requestimport requests, refrom bs4 import BeautifulSoupfrom wordcloud import WordCloudimport pandas as pdfrom imageio import imreadimport matplotlib.pyplot as pltimport jiebadef getHtml(url): """獲取url頁面""" headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'} req = urllib.request.Request(url,headers=headers) req = urllib.request.urlopen(req) content = req.read().decode('utf-8') return contentdef cut_words(top_search): top_cut=[] for top in top_search: top_cut.extend(list(jieba.cut(top))) #使用精確模式切割詞彙 return top_cutdef getComment(url): """解析HTML頁面""" html = getHtml(url) soupComment = BeautifulSoup(html, 'html.parser') comments = soupComment.findAll('span', 'short') onePageComments = [] for comment in comments: # print(comment.getText()+'\n') onePageComments.append(comment.getText()+'\n') return onePageCommentsdef getid(name): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36', } movie_name = name params = { "q": movie_name } search_url = "https://www.douban.com/search" r = requests.get(search_url, params=params, headers=headers) soup = BeautifulSoup(r.content, 'lxml') first_movie_info = soup.find('a', {'class': 'nbg'})['onclick'] pattern = re.compile('\d{4,}') sid = str(pattern.search(first_movie_info).group()) return(sid)def get_data(): with open('電影評論.txt', 'w', encoding='utf-8') as f: sid=getid(_input.get()) for page in range(10): # 豆瓣爬取多頁評論需要驗證。 url = 'https://movie.douban.com/subject/'+sid+'/comments?start=' + str(20*page) + '&limit=20&sort=new_score&status=P' for i in getComment(url): f.write(i) with open("電影評論.txt", "r", encoding='UTF-8') as fin1: all_words = cut_words(fin1) #定義停用詞 stop = ['的','你','了','將','為','例',' ','多','再','有','是','等','天','次','讓','在','我','也','就','這樣','啊','和','都','《','》',',','看','!','什麼','怎麼','這麼','很','給','沒有','不是','說' ,'不','嗎','?','!' ,'?','。' ,'...' ,'電影','主','男','女' ] words_cut = [] for word in all_words: if word not in stop: words_cut.append(word) word_count = pd.Series(words_cut).value_counts() back_ground = imread("F:\\flower.jpg") wc = WordCloud( font_path="C:\\Windows\\Fonts\\simhei.ttf", #設定字型 background_color="white", #設定詞雲背景顏色 max_words=400, #詞雲允許最大詞彙數 mask=back_ground, #詞雲形狀 max_font_size=400, #最大字型大小 random_state=90 #配色方案的種數 ) wc1 = wc.fit_words(word_count) #生成詞雲 plt.figure() plt.imshow(wc1) plt.axis("off") plt.show() wc.to_file("ciyun.png") print('succeed!\n')app = Tk()_input = Entry()#_input.place(x=113, y=80)_input.pack()app.title("電影評論關鍵詞生成器")screenwidth = app.winfo_screenwidth()screenheight = app.winfo_screenheight()dialog_width = 400dialog_height = 170# 前兩個引數是視窗的大小,後面兩個引數是視窗的位置app.geometry( "%dx%d+%d+%d" % (dialog_width, dialog_height, (screenwidth - dialog_width) / 2, (screenheight - dialog_height) / 2))btn = Button(text='查詢', command=get_data,width=10)btn.place(x=155, y=80)btn.pack()app.mainloop()
END 學業繁重,好久沒更新,後續寒假可能會更新,一起加油
最新評論