小爬怡情,中爬傷身,強爬灰灰。爬蟲有風險,使用請謹慎,多是這兩天爬豆瓣電影爬多了,今天早上登陸的時候提示號被封了(我用本身賬號爬的,是找死呢仍是在找死呢 ...),好在後面發完短信後又解封了,^_^。html
以前的文章中,已把電影短評數據裝進了Mongo中,今天把數據取出來簡單分析一下,當下最火的作法是進行詞頻統計並生成詞雲,今天說的就是這個。python
不知道什麼緣由,我實際爬下來的短評數據只有1000條(很少很多,剛恰好),我總以爲有什麼不對,但我重複爬了幾回後,確實只有這麼多。多是我爬蟲寫的有什麼不對吧,文末附源碼連接,有興趣的去看看, 歡迎拍磚(輕拍)。git
import pymongo import jieba from jieba import analyse # https://pypi.org/project/pymongo/ # http://github.com/mongodb/mongo-python-driver from matplotlib import pyplot from wordcloud import WordCloud text = None with pymongo.MongoClient(host='192.168.0.105', port=27017) as client: # 獲取集合 comments = client.douban.movie_26752088_comments # 不知道爲何爬蟲只取到了1000條評論~ print('count:', comments.estimated_document_count()) # pymongo.cursor.Cursor cursor = comments.find() # 遍歷數據,這裏只遍歷短評數據(好在數據量並不太大) text = ''.join(map(lambda doc: doc.get('comment'), cursor)) # 對短語數據文本進行分詞 # 添加自定義分詞 [jieba.add_word(k) for k in []] # 取Top50的詞生成詞雲 # https://github.com/fxsjy/jieba#基於-tf-idf-算法的關鍵詞抽取 tags = analyse.extract_tags(text, topK=50, withWeight=False) new_text = ' '.join(tags) print(new_text)
中文分詞部分,默認分詞效果已經很是好了,我未添加自定義字典,這裏感謝一下 結巴
的做者github
也感謝一下 word_cloud
的做者,^_^算法
# 對分詞文本生成詞雲 # 生成詞雲,須要指定支持中文的字體,不然沒法生成中文詞雲 wc = WordCloud( # 設置詞雲圖片背景色,默認黑色 # background_color='white', # 設置詞雲最大單詞數 max_words=200, # 設置詞雲中字號最大值 # max_font_size=80, # 設置詞雲圖片寬、高 width=768, height=1024, # 設置詞雲文字字體(美化和解決中文亂碼問題) font_path=r'../example/fonts/FZXingKai-S04S.TTF' ).generate(new_text) # 繪圖(標準長方形圖) pyplot.imshow(wc, interpolation='bilinear') pyplot.figure() pyplot.axis('off') # 將圖片輸出到文件 wc.to_file(r'./images/wc.png')
生成詞雲效果mongodb
看來網上關於 我不是藥神 vs 達拉斯 的爭論很熱啊。關於詞頻統計就這些,代碼中也會完成一些其它的分析任務(其實都是一些很簡單的任務,純練手用),後續會持續更新。api
import pymongo # 取點贊最多的前10條短評 with pymongo.MongoClient(host='192.168.0.105') as client: comments = client.douban.movie_26752088_comments for doc in comments.find().sort([('vote', -1)]).limit(10): print('author = {}, date = {}, vote = {}, comment = {}'.format( doc.get('author'), doc.get('date'), doc.get('vote'), doc.get('comment') ))
# 每日評論數,基於今生成日期評論走勢圖(用Excel生成的 ^_^) from datetime import datetime import pymongo from bson import Code # http://api.mongodb.com/python/current/ # http://api.mongodb.com/python/current/api/pymongo/collection.html#pymongo.collection.Collection.map_reduce with pymongo.MongoClient(host='192.168.0.105') as client: comments = client.douban.movie_26752088_comments fn_map = Code(""" function () { if (this.date != null) { emit(this.date, 1); } } """) fn_reduce = Code(""" function (key, values) { var total = 0; for (var i = 0; i < values.length; i++) { total += values[i]; } return total; } """) # pymongo.collection.Collection results = comments.map_reduce(fn_map, fn_reduce, out="mr_results") # 取最近15天數據 for col in results.find().sort([('_id', -1)]).limit(15): # 格式化輸出 print(col['_id'].strftime('%Y-%m-%d'), '\t', int(col['value'])) # 刪除生成的結果集合 client.douban.mr_results.drop()