1. 程式人生 > >爬取豆瓣電影短評並使用詞雲簡單分析top50

爬取豆瓣電影短評並使用詞雲簡單分析top50

先使用程序池爬取豆瓣電影短評

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()

生成圖片可以明顯知道哪些高頻詞語

wc