Python採集微博熱評進行情感分析祝你狗年脫單
Ps: 重要的事情說三遍!!! 結尾有彩蛋,結尾有彩蛋,結尾有彩蛋。
如果自己需要爬(cai)蟲(ji)的數據量比較大,為了防止被網站封Ip,可以分時段爬取,另外對於爬到的數據一般是用來存儲資料庫,這就需要對數據進行去重處理,記錄上次爬取的狀態,就可以實現在爬蟲中斷後,可以快速繼續上次的狀態,實現增量爬取,這裡可以參考我之前寫過的一個新聞採集,增量採集新聞數據,本文寫的對新浪微博的數據採集和處理完整代碼在我的Github。
玩微博的人大多數應該知道微博搞笑排行榜的,剛好寫這篇文之前看到榜姐1月8號0點話題是一人說一個,追女孩的小道理,感覺這個話題簡直是對廣大單身男性的福利啊,ヾ(??▽?)ノ,故有了何不就採集一下評論來分析一波的想法。
1.使用新浪微博提供的API對數據進行採集
作為一個爬蟲菜鳥來說,如果不會使用代理IP池,同時對網站的反爬機制不太清楚,建議先去看下網站是否自己提供的有API,今天我們要爬取的網站是新浪微博,當然新浪網作為為全球用戶24小時提供全面及時的中文資訊的大網站,一定是提供自己的API介面的。這樣的大網站,必定是經歷了無數場爬蟲與反爬之間的戰爭,也一定有很健全的反爬策略,所以我們可以通過調用新浪微博的開放平台來獲取我們想要的信息。使用之前請詳細閱讀API文檔,在開放平台認證為開發者,附App key鏈接。
- APIClient下載地址
# 如果這裡引入失敗,可以直接下載SDK和文件放一塊就ok
from weibo import APIClient
import sys
reload(sys)sys.setdefaultencoding(utf-8)APP_KEY = 你的App Key# 獲取的app key APP_SECRET = 你的AppSecret
# 獲取的appsecret CALLBACK_URL = https://api.weibo.com/oauth2/default.html
#回調鏈接
# 在網站設置"使用微博賬號登陸"的鏈接,當用戶點擊鏈接後,引導用戶跳轉至如下地址 client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL) # 得到授權頁面的url,利用webbrowser打開這個url url = client.get_authorize_url() webbrowser.open_new(url) #打開默認瀏覽器獲取code參數
# 獲取URL參數code:
print
輸入url中code後面的內容後按回車鍵:
code = raw_input() # 人工輸入網址後面的code內容
r = client.request_access_token(code) # 獲得用戶授權 access_token = r.access_token # 新浪返回的token,類似abc123xyz456expires_in = r.expires_in# 設置得到的access_token,client可以直接調用API了client.set_access_token(access_token, expires_in)
獲取某個用戶最新發表的微博列表
uid 的獲取方式,我們點開不同的微博,會發現鏈接中https://m.weibo.cn/u/2706896955?sudaref=login.sina.com.cn&display=0&retcode=6102 u之後的數字就是用戶的uid。
content = client.statuses.user_timeline(uid=2706896955, count=100)
返回的結果是json格式的
{
"favorited": false, "truncated": false, "in_reply_to_status_id": "",
"in_reply_to_user_id": "",
"in_reply_to_screen_name": "", "geo": null, "mid": "5612814510546515491", "reposts_count": 8, "comments_count": 9, "annotations": [], "user": { "id": 1404376560, "screen_name": "zaku",
"name": "zaku",
"province": "11", "city": "5", "location": "北京 朝陽區", "description": "人生五十年,乃如夢如幻;有生斯有死,壯士復何憾。", "url": "http://blog.sina.com.cn/zaku", "profile_image_url": "http://tp1.sinaimg.cn/1404376560/50/0/1", "domain": "zaku", "gender": "m", "followers_count": 1204,
"friends_count": 447,
"statuses_count": 2908, "favourites_count": 0, "created_at": "Fri Aug 28 00:00:00 +0800 2009", "following": false, "allow_all_act_msg": false, "remark": "", "geo_enabled": true, "verified": false, "allow_all_comment": true,
"avatar_large": "http://tp1.sinaimg.cn/1404376560/180/0/1",
"verified_reason": "", "follow_me": false, "online_status": 0, "bi_followers_count": 215 } }, ... ], "previous_cursor": 0, // 暫未支持
"next_cursor": 11488013766, // 暫未支持
"total_number": 81655
}
返回的欄位說明
假設我們想要查看的是微博信息內容調用text即可
for info in content.comments:
2.新浪微博爬蟲
chrome瀏覽器右鍵檢查查看network這些老套路我就不說了,不懂得可以翻Python網路爬蟲(一)- 入門基礎 從頭開始看。另外:代碼是針對新浪微博移動端 https://m.weibo.cn/進行信息採集,之所以爬移動端而不是PC所有社交網站爬蟲,優先選擇爬移動版(不要來問我為什麼好爬,我也不知道 逃
- 可以看到最新評論的url是
https://m.weibo.cn/api/comments/show?id= + 微博id + &page= + 頁碼
點來鏈接https://m.weibo.cn/single/rcListformat=cards&id=4193705642468999&type=comment&hot=0&page=2即為返回的json格式的數據
接下來直接上代碼
import re
# 第幾條評論
while
True:res = requests.get(url=url.format(i), headers=headers)r = res.json()content = r[0][card_group]if r.status_code == 200: try: for j in range(0, len(content)): hot_data = content[j] comment_id = hot_data[user][id] # 用戶id user_name = hot_data[user][screen_name] # 用戶名 created_at = hot_data[created_at] # 評論時間 comment = re.sub(<.*?>|回復<.*?>:|[U00010000-U0010ffff]|[uD800-uDBFF][uDC00-uDFFF], , hot_data[text]) # 評論內容 like_counts = hot_data[like_counts] # 點贊數 comment_num += 1 i += 1 time.sleep(3) except Exception as e: logger.debug(e)else: break
接下來就是對數據的保存和處理了。注意:新浪畢竟是大廠,對爬蟲肯定有自己的反爬策略,為了防止訪問頻繁被封禁,可以設置代理ip池,限制抓取時間等等。你問我怎麼知道的,我才不會告訴你~
如果你出現了這個頁面或者採集不到任何信息,恭喜你,被新浪寵幸了
3.數據的存儲和處理
因為現在越來越多的公司開始逐漸使用PostgreSQL作為公司資料庫,這裡我們就把數據存儲於Postgresql,為了使我們的整個項目更加工程化,我們把對資料庫的操作單獨定義方法。
# 對資料庫實現查詢的方法
def
execute_select(conn, sql, params=None):
with conn.cursor() as cur:
def
execute_sql(conn, sql, params=None):
with conn.cursor() as cur: if params: cur.execute(sql, params) else: cur.execute(sql)
大功告成了一半,運行代碼 --> 保存資料庫 接下來當然是對我們拿下的數據進行分(hu)析(shuo)展(ba)示(dao)了(千年不變的套路hhhhhh..)
這裡我們可以看到數據已經成功存儲與資料庫
4.數據的處理和分析
既然說到對中文數據的處理和展示,我們常用的就幾種方法,詞雲、情感分析、數據可視化展示,這裡我就必須提到python中比較出名的一個中文NLP庫:snowNLP,snowNLP能夠根據給出的句子生成一個0-1之間的值,當值大於0.5時代表句子的情感極性偏向積極,當分值小於0.5時,情感極性偏向消極,越偏向兩頭,情感就越敏感。使用一個庫最簡單暴力的方法———讀官方文檔。
snownlp的使用也很簡單
一
二
我隨機抽取了兩張結果,簡單標註了一下,我們不難發現涉及到主動、長得帥、有錢的、要勇敢、口紅、情商這幾個詞生成的值都在0.9,矮矬窮、渣、你他媽這些詞生成的值都在0.5以下,林佳,給我留一口啊!是什麼鬼,竟然0.7???
- 雖然數據量大(其實是沒有剔除停用詞ヾ(??▽?)ノ)導致的詞雲圖效果不太好,但是我們還是可以看到聊天、主動、好看這幾個詞的詞頻較高,至於為什麼我不剔除停用詞,是因為沒有語料庫還是因為不會用,都不是,因為我懶,我懶,我懶... 剔除停用詞的教程之前寫的文章中有:Python數據科學(三)- python與數據科學應用(Ⅲ)
def
word_cloud(comment):
- 對處理過得情感值列表進行統計,並生成分布圖,採集的評論大概有5w條
def
snow_analysis(comment):
# logger.debug(li, s.sentiments) print(li, s.sentiments) sentimentslist.append(s.sentiments) fig1 = plt.figure("sentiment") plt.hist(sentimentslist, bins=np.arange(0, 1, 0.02)) plt.show()
微博 一個人說一個,追女孩的小道理 評論的情感值分布
可以看到情感值在接近0.6~1.0左右位置頻率較高,說明粉絲們對於這則微博的評論積極態度佔大多數,因為這個微博本身就是偏積極性的,得出的結果也說明了這個問題。
我們的初衷是為了如何追女孩子,我就統計了一下出現比較多的評論(有博主為了搶熱門頻繁刷評論?),三行代碼就可以搞定,這個Counter的用法之前也寫過,傳送門:使用python中的第三方庫Counter
# 使用python的第三方庫
from collections import Counter
1.一定要主動啊 不然等女孩子主動嗎!但是主動也要適度 別讓對方覺得害怕…
2.人品要好,三觀要正確,責任感,孝順善良這些內在因素也很重要
3.追某個女孩時時 只追她一個人 千萬別撩別人
4.言談幽默風趣但不要輕佻
5.對她當女兒養吧
6.女孩子是要用來寵的,不是來跟她講道理的。
7.多陪她聊天,多關心她,愛護她,保護她,了解她,寵她,尊重她,給她安全感
8.不要曖昧不清,不要套路
文末彩蛋:
有很多男生抱怨自己追不到喜歡的姑娘,追了幾個星期就放棄了。其實,要改變的是你自己,只要努力向上,讓自己變得更優秀,同時對姑娘保持適當的關心和熱情,堅持幾個月,總有一天你就會發現,不喜歡就是不喜歡這是沒有辦法的事情。
最後,由於這篇博客是2018年第一篇博客,那麼就祝大家狗年脫單了~
作者:許勝利 Python愛好者社區專欄作者,請勿轉載,謝謝。
博客專欄:許勝利的博客專欄配套視頻教程:Python3爬蟲三大案例實戰分享 公眾號:Python愛好者社區(微信ID:python_shequ),關注,查看更多連載內容。
推薦閱讀:
※Python入門 數據結構 list列表
※[轉載]python 的日誌logging模塊學習
※利用函數計算實現網路遊戲或視頻直播中的敏感詞檢測
※為什麼我總是感覺python的語法很挫了,有人有同感嗎?
※揣著Django做項目