爬取豆瓣電影短評並使用詞雲簡單分析top50
阿新 • • 發佈:2018-11-21
先使用程序池爬取豆瓣電影短評
import requests import re import random import time import pandas as pd from pymongo import MongoClient from multiprocessing import Pool from fake_useragent import * #簡單反反爬措施,使用多個UA ua = UserAgent() #連線mongo資料庫 conn = MongoClient('localhost') db =conn.spyder myset = db.douban def get_db(page): #隨機獲取UA抓取資料並判斷狀態碼 headers = {"User-Agent":random.choice(ua)} url ="https://movie.douban.com/subject/26752088/comments?start={}&limit=20&sort=new_score&status=P".format(page*20) req = requests.get(url,headers=headers) req.encoding ="utf-8" if req.status_code ==200: print("第%s頁爬取成功"%str(page+1)) else: print("第%s頁爬取失敗"%str(page+1)) result = req.text # 將目標HTML使用正則表示式篩選資訊並使用yield返回 pattern =re.compile('<a href="https://www.douban.com/people/[\s\S]*?" class="">([\s\S]*?)</a>[\s\S]*?<span class="short">([\s\S]*?)</span>') rf = re.findall(pattern,result) for i in rf: yield {'name':i[0].strip(), 'content':i[1].strip()} def save_to_mongo(file): """ 插入資料庫 """ if myset.insert(file): print('插入成功') else: print('失敗') def main(page): """ 主函式 """ for file in get_db(page): save_to_mongo(file) if __name__ =="__main__": #使用程序池提速抓取,可以考慮sleep pool = Pool() pool.map(main,[i for i in range(50)]) pool.close() pool.join()
將資料從資料庫取出並生成詞雲
import jieba from wordcloud import WordCloud import pymongo import matplotlib.pyplot as mp from jieba import analyse text = None with pymongo.MongoClient('localhost') as client: #獲取集合 db = client.spyder myset = db.douban #列印資料庫總評論數 print('count:',myset.estimated_document_count()) cursor = myset.find() #遍歷資料,這裡只遍歷短評數 text = ''.join(map(lambda doc:doc.get('content'),cursor)) #對短語資料文字分詞 #新增自定義分詞 [jieba.add_word(k) for k in []] #取Top50的詞生成詞雲 tags = analyse.extract_tags(text,topK=50,withWeight=False) new_text = ' '.join(tags) print(new_text) #對分詞文字生成詞雲 #生成詞雲,需要指定中文字型,否則無法生成中文詞雲 image=mp.imread('./wc.jpg') wc = WordCloud( #設定背景色,預設黑色 # background_color = 'white', #設定詞雲最大單詞數 max_words=200, #設定詞雲中字號最大值 #max_font_size = 80, #設定詞雲圖片寬,高, # mask=image, width=768, height=1024, #設定詞雲檔案字型(美化和解決中文亂碼問題) font_path='STZHONGS.TTF' ).generate(new_text) #繪圖(標準長方形圖) mp.imshow(wc,cmap='rainbow',interpolation='bilinear') mp.figure('db.wordcloud') mp.axis('off') #將圖片輸出到檔案 # wc.to_file(r'./images/wc.png') mp.show()
生成圖片可以明顯知道哪些高頻詞語