Python入門之電影詞雲分析
阿新 • • 發佈:2018-12-23
需求:將豆瓣電影的評論爬取出來,用詞雲的方式對其進行分析
步驟分析:
1). 分析網站的原始碼
2). 通過url獲取電影名和電影id
3). 獲取指定的電影的評論
4). 資料的清洗,去除一些不需要的資訊
5). 進行詞雲的分析
分析網站的原始碼
通過原始碼分析,豆瓣電影是靠電影名稱和電影的id來區分每個電影的,想要獲取各個電影的影評,需要先獲取上面兩個資訊
比如以下這部電影,它的id就是:27039069
通過不同的id號,來訪問不同的電影影評。
通過url獲取電影名和電影id
import requests from bs4 import BeautifulSoup url='https://movie.douban.com/cinema/nowplaying/xian/' # 1)獲取頁面資訊 response=requests.get(url) content=response.text # print(content) # 2)分析頁面,獲取id和電影名 soup=BeautifulSoup(content,'html.parser') # 先找到所有的電影資訊對應的li標籤 nowplaying_movie_list=soup.find_all('li',class_='list-item') # 儲存所有的電影資訊(名稱和id) movies_info=[] for item in nowplaying_movie_list: nowplaying_movie_dict = {} nowplaying_movie_dict['title']=item['data-title'] nowplaying_movie_dict['id']=item['id'] movies_info.append(nowplaying_movie_dict) print(movies_info)
獲取指定的電影的評論
import requests from bs4 import BeautifulSoup import threading def get_info(id,pageNum): # 根據頁數確定start的值 start=20*(pageNum-1) url='https://movie.douban.com/subject/%s/comments?start=%s&limit=20&sort=new_score&status=P' %(id,start) # 2)爬取評論資訊的網頁內容 content=requests.get(url).text # 3)通過bs4分析網頁 soup=BeautifulSoup(content,'html.parser') commentsList=soup.find_all('span',class_='short') comments='' for commentTag in commentsList: comments+=commentTag.text print(comments) id = '27039069' threads=[] for pageNum in range(1,10): get_info(id,pageNum) t=threading.Thread(target=get_info,args=(id,pageNum)) threads.append(t) t.start() [thread.join() for thread in threads]
資料的清洗,去除一些不需要的資訊
將評論中的表情或者特殊字元去掉,只留下文字與英文,作詞雲分析
import re
with open('./27039069.txt')as f:
comments=f.read()
pattern=re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z]+)')
deal_comments=re.findall(pattern,comments)
newComments=''
for item in deal_comments:
newComments+=item
print(newComments)
做詞雲分析時,這裡需要兩個特殊的模組
import wordcloud
import jieba
import jieba
import wordcloud
import numpy
from PIL import Image
result=jieba.lcut(open('./27039069.txt').read())
imageObj=Image.open('./image.jpg')
cloud_mask=numpy.array(imageObj)
wc=wordcloud.WordCloud(
background_color='snow',
mask=cloud_mask,
font_path='./msyh.ttf',
min_font_size=5,
max_font_size=50,
width=260,
height=260,
)
wc.generate(','.join(result))
wc.to_file('./ciyun.png')