不少人都是在朋友圈裝死,微博上蹦迪。
微信朋友圈已經不是一個能夠隨意發表心情的地方了,微博纔是!html
因此你不要傻傻盯着女神的朋友圈發呆啦!本文教你如何用 Python 自動通知女神微博情緒變化,從今天開始作一個貼心小棉襖。python
爲了及時獲取這些消息,三步能夠實現:json
一、定時自動爬取微博內容
二、微博內容的情緒分析
三、郵件自動提醒api
1、微 博 內 容 獲 取服務器
首先是一些常規操做:你須要註冊一個微博帳戶,找到你微博帳戶的 Cookie微信
而後找到你須要關注的微博用戶的 id,下面以李榮浩爲例:cookie
或者直接去用戶主頁查看,進入指定用戶主頁,如李榮浩的主頁 :https://m.weibo.cn/u/1739046981?uid=1739046981&luicode=10000011&lfid=231093_-_selffollowed其中 1739046981 就是 uid。先根據這些信息設置好本身的帳號,因爲最新的微博內容確定在第一頁,設置好首頁微博內容的 url學習
# 改爲本身的user_id和cookie user_id = YOUR_ID cookie = {"Cookie": "YOUR_COOKIE"} # url url = 'http://weibo.cn/%d/profile?page=1'%user_id # 獲取初始url頁面html內容,獲取user_id和cookie(在返回的response header中) html = requests.get(url, cookies = cookie).content print ('user_id和cookie讀入成功')
有了這些信息之後,咱們就能夠爬取微博內容啦,這裏須要注意的是咱們須要加一個第一條微博的判斷。ui
#根據用戶uid獲取該用戶第一頁的微博消息 page_num = 1 nickname = None weibo = None try: json = r.get( ('https://m.weibo.cn/api/container/getIndex?' 'is_search[]=0&' 'visible[]=0&' 'is_all[]=1&' 'is_tag[]=0&' 'profile_ftype[]=1&' 'page={0}&' 'jumpfrom=weibocom&' 'sudaref=weibo.com&' 'type=uid&' 'value={1}&' 'containerid=107603{1}').format(page_num, uid), verify=False, ).json() except: return None, None if json['ok'] == 0: print('sth wrong') return None, None else: for card in json['cards']: if card['card_type'] == 9: weibo = [ card['mblog']['created_at'], BeautifulSoup( card['mblog']['text'], 'lxml' ).text.replace(' \u200b\u200b\u200b', ''), *get_comments_from_one_weibo( card['mblog']['id']), ]
這樣的話咱們就能夠獲取到女神的最新微博啦~下面要作的就是根據獲取到的微博數據來分析情感內容。url
2、微 博 內 容 情 感
這部分僅對文本內容有效,若是是圖片內容就直接通知你內容不作情感分析。若是須要計算中文文本內容的情緒分,主要是三步:一、情感字典及對應的分數二、數據的分詞處理三、構建情緒分計算邏輯這裏主要介紹一下情緒分的計算邏輯,情感詞典和完整的實現邏輯後臺回覆「微博通知」獲取,下次再專門寫一篇針對文本情緒評分的內容。
簡化的情感分數計算邏輯:全部情感詞語組的分數之和
定義一個情感詞語組:
兩情感詞之間的全部否認詞和程度副詞與這兩情感詞中的後一情感詞構成一個情感詞組,即 notWords + degreeWords + sentiWords,
例如不是很開心,其中不是爲否認詞,很爲程度副詞,開心爲情感詞,那麼這個情感詞語組的分數爲:finalSentiScore = (-1) ^ 1 * 1.25 * 3.546其中1指的是一個否認詞,1.25 是程度副詞的數值,3.546 是開心的情感分數。僞代碼以下:finalSentiScore = (-1) ^ (num of notWords) * degreeNum * sentiScorefinalScore = sum(finalSentiScore)具體實現邏輯以下:
def scoreSent(senWord, notWord, degreeWord, segResult): W = 1 score = 0 # 存全部情感詞的位置的列表 senLoc = senWord.keys() notLoc = notWord.keys() degreeLoc = degreeWord.keys() senloc = -1 # notloc = -1 # degreeloc = -1 # 遍歷句中全部單詞segResult,i爲單詞絕對位置 for i in range(0, len(segResult)): # 若是該詞爲情感詞 if i in senLoc: # loc爲情感詞位置列表的序號 senloc += 1 # 直接添加該情感詞分數 score += W * float(senWord[i]) # print "score = %f" % score if senloc < len(senLoc) - 1: # 判斷該情感詞與下一情感詞之間是否有否認詞或程度副詞 # j爲絕對位置 for j in range(senLoc[senloc], senLoc[senloc + 1]): # 若是有否認詞 if j in notLoc: W *= -1 # 若是有程度副詞 elif j in degreeLoc: W *= float(degreeWord[j]) # i定位至下一個情感詞 if senloc < len(senLoc) - 1: i = senLoc[senloc + 1] return score
經過這個計算邏輯最終輸出整條微博的情緒評分,在作這個最重要的是要有好用的語料庫,定義好正向情感詞和負向情感詞。
基礎情感詞典已經有整理好了的情感詞典。使用的是大連理工大學的情感詞彙本體庫,停用詞表使用哈工大的停用詞表。
3、郵 件 自 動 提 醒
當咱們獲取到新的微博內容時,就須要將消息推送到咱們的郵箱,這時候,咱們須要添加斷定條件,判斷是否執行郵件提醒。這個判斷條件與爬取最新微博的判斷設置成一致。python 發郵件須要掌握兩個模塊的用法,smtplib 和 email,這倆模塊是 python 自帶的,只需 import 便可使用。smtplib 模塊主要負責發送郵件,email 模塊主要負責構造郵件。smtplib 模塊主要負責發送郵件:是一個發送郵件的動做,鏈接郵箱服務器,登陸郵箱,發送郵件(有發件人,收信人,郵件內容)。email 模塊主要負責構造郵件:指的是郵箱頁面顯示的一些構造,如發件人,收件人,主題,正文,附件等。導入咱們須要用到的包
from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage import smtplib msg = MIMEMultipart()
在郵件中插入微博正文,同時將情緒分值添加到郵件正文裏:
##在郵件中插入文本信息 df_text="Hi!\n你的女神新發了一條微博,情緒分值只有 %s \n快去看看吧!"% score msgtext = MIMEText(df_text, 'plain', 'utf-8') msg.attach(msgtext)
剩下的就是設置一些郵件參數來發送郵件:
#Python學習羣592539176 #設置郵件信息常量 email_host= '' # 服務器地址 sender = '' # 發件人 password ='' # 密碼,若是是受權碼就填受權碼 receiver = '' # 收件人
發送郵件:
try: smtp = smtplib.SMTP(host=email_host) smtp.connect(email_host,port) smtp.starttls() smtp.login(sender, password) smtp.sendmail(sender, receiver.split(',') , msg.as_string()) smtp.quit() print('發送成功') except Exception: print('發送失敗')
具體郵件發送參數說明以下:
smtplib.SMTP():實例化SMTP()
connect(host,port):
email_host:指定鏈接的郵箱服務器。經常使用郵箱的smtp服務器地址以下:
新浪郵箱:smtp.sina.com
163網易郵箱:smtp.163.com。
port:指定鏈接服務器的端口號,默認爲25
login(user,password):
sender:登陸郵箱的用戶名。
password:登陸郵箱的密碼(網易郵箱通常是網頁版,須要用到客戶端密碼,須要在網頁版的網易郵箱中設置受權碼,該受權碼即爲客戶端密碼)
sendmail(from_addr,to_addrs,msg,…):
sender:郵件發送者地址
receiver:郵件接收者地址
msg:郵件內容
quit():用於結束SMTP會話
4、效 果 展 示
運行程序結果以下:
若是你以爲文章還不錯,請你們點贊分享下。你的確定是我最大的鼓勵和支持。