Python采集微博熱評(píng)進(jìn)行情感分析祝你狗年脫單

Ps: 重要的事情說三遍!S欢怠! 結(jié)尾有彩蛋佳恬,結(jié)尾有彩蛋捏境,結(jié)尾有彩蛋于游。

如果自己需要爬(cai)(ji)的數(shù)據(jù)量比較大,為了防止被網(wǎng)站封Ip垫言,可以分時(shí)段爬取贰剥,另外對(duì)于爬到的數(shù)據(jù)一般是用來存儲(chǔ)數(shù)據(jù)庫,這就需要對(duì)數(shù)據(jù)進(jìn)行去重處理筷频,記錄上次爬取的狀態(tài)蚌成,就可以實(shí)現(xiàn)在爬蟲中斷后,可以快速繼續(xù)上次的狀態(tài)凛捏,實(shí)現(xiàn)增量爬取担忧,這里可以參考我之前寫過的一個(gè)新聞采集,增量采集新聞數(shù)據(jù)坯癣,本文寫的對(duì)新浪微博的數(shù)據(jù)采集和處理完整代碼在我的Github瓶盛。
玩微博的人大多數(shù)應(yīng)該知道微博搞笑排行榜的,剛好寫這篇文之前看到榜姐1月8號(hào)0點(diǎn)話題是一人說一個(gè)示罗,追女孩的小道理惩猫,感覺這個(gè)話題簡(jiǎn)直是對(duì)廣大單身男性的福利啊,ヾ(???)ノ蚜点,故有了何不就采集一下評(píng)論來分析一波的想法轧房。

1.使用新浪微博提供的API對(duì)數(shù)據(jù)進(jìn)行采集

作為一個(gè)爬蟲菜鳥來說,如果不會(huì)使用代理IP池绍绘,同時(shí)對(duì)網(wǎng)站的反爬機(jī)制不太清楚奶镶,建議先去看下網(wǎng)站是否自己提供的有API,今天我們要爬取的網(wǎng)站是新浪微博脯倒,當(dāng)然新浪網(wǎng)作為為全球用戶24小時(shí)提供全面及時(shí)的中文資訊的大網(wǎng)站实辑,一定是提供自己的API接口的。這樣的大網(wǎng)站藻丢,必定是經(jīng)歷了無數(shù)場(chǎng)爬蟲與反爬之間的戰(zhàn)爭(zhēng)剪撬,也一定有很健全的反爬策略,所以我們可以通過調(diào)用新浪微博的開放平臺(tái)來獲取我們想要的信息悠反。使用之前請(qǐng)?jiān)敿?xì)閱讀API文檔残黑,在開放平臺(tái)認(rèn)證為開發(fā)者,附App key鏈接斋否。

# 如果這里引入失敗梨水,可以直接下載SDK和文件放一塊就ok
from weibo import APIClient 
import webbrowser

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' #回調(diào)鏈接 

# 在網(wǎng)站設(shè)置"使用微博賬號(hào)登陸"的鏈接,當(dāng)用戶點(diǎn)擊鏈接后茵臭,引導(dǎo)用戶跳轉(zhuǎn)至如下地址  
client = APIClient(app_key=APP_KEY, app_secret=APP_SECRET, redirect_uri=CALLBACK_URL) 
# 得到授權(quán)頁面的url疫诽,利用webbrowser打開這個(gè)url  
url = client.get_authorize_url() 
webbrowser.open_new(url) #打開默認(rèn)瀏覽器獲取code參數(shù) 

# 獲取URL參數(shù)code:
print '輸入url中code后面的內(nèi)容后按回車鍵:'

code = raw_input() # 人工輸入網(wǎng)址后面的code內(nèi)容  
r = client.request_access_token(code)  # 獲得用戶授權(quán) 
access_token = r.access_token   # 新浪返回的token,類似abc123xyz456
expires_in = r.expires_in
# 設(shè)置得到的access_token,client可以直接調(diào)用API了
client.set_access_token(access_token, expires_in)

獲取某個(gè)用戶最新發(fā)表的微博列表

uid 的獲取方式奇徒,我們點(diǎn)開不同的微博雏亚,會(huì)發(fā)現(xiàn)鏈接中https://m.weibo.cn/u/2706896955?sudaref=login.sina.com.cn&display=0&retcode=6102 u之后的數(shù)字就是用戶的uid。

content = client.statuses.user_timeline(uid=2706896955, count=100)

返回的結(jié)果是json格式的

{
    "statuses": [
        {
            "created_at": "Tue May 31 17:46:55 +0800 2011",
            "id": 11488058246,
            "text": "求關(guān)注摩钙。"罢低,
            "source": "<a  rel="nofollow">新浪微博</a>",
            "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": "北京 朝陽區(qū)",
                "description": "人生五十年,乃如夢(mèng)如幻胖笛;有生斯有死网持,壯士復(fù)何憾。",
                "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
}
返回的字段說明

假設(shè)我們想要查看的是微博信息內(nèi)容調(diào)用text即可

for info in content.comments:
         text = info.text

2.新浪微博爬蟲

chrome瀏覽器右鍵檢查查看network這些老套路我就不說了长踊,不懂得可以翻Python網(wǎng)絡(luò)爬蟲(一)- 入門基礎(chǔ) 從頭開始看功舀。
另外:代碼是針對(duì)新浪微博移動(dòng)端 https://m.weibo.cn/
進(jìn)行信息采集,之所以爬移動(dòng)端而不是PC所有社交網(wǎng)站爬蟲之斯,優(yōu)先選擇爬移動(dòng)版(不要來問我為什么好爬日杈,我也不知道 逃

  • 可以看到最新評(píng)論的url是'https://m.weibo.cn/api/comments/show?id=' + 微博id + '&page=' + 頁碼

點(diǎn)來鏈接https://m.weibo.cn/single/rcListformat=cards&id=4193705642468999&type=comment&hot=0&page=2即為返回的json格式的數(shù)據(jù)

接下來直接上代碼

import re
import time
import requests

uid = '4193705642468999'
url = 'https://m.weibo.cn/single/rcList?format=cards&id=' + uid + '&type=comment&hot=0&page={}'
headers = {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
"Cookie": "你的cookie",
"Host": "m.weibo.cn",
"Referer": "https://m.weibo.cn/status/" + uid,
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Mobile Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}

i = 0
comment_num = 1  # 第幾條評(píng)論
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']  # 評(píng)論時(shí)間
                comment = re.sub('<.*?>|回復(fù)<.*?>:|[\U00010000-\U0010ffff]|[\uD800-\uDBFF][\uDC00-\uDFFF]', '', hot_data['text'])  # 評(píng)論內(nèi)容
                like_counts = hot_data['like_counts']  # 點(diǎn)贊數(shù)
                comment_num += 1
            i += 1
            time.sleep(3)
        except Exception as e:
            logger.debug(e)
else:
    break

接下來就是對(duì)數(shù)據(jù)的保存和處理了。
注意:
新浪畢竟是大廠佑刷,對(duì)爬蟲肯定有自己的反爬策略莉擒,為了防止訪問頻繁被封禁,可以設(shè)置代理ip池瘫絮,限制抓取時(shí)間等等涨冀。你問我怎么知道的,我才不會(huì)告訴你~

如果你出現(xiàn)了這個(gè)頁面或者采集不到任何信息麦萤,恭喜你鹿鳖,被新浪寵幸了

3.數(shù)據(jù)的存儲(chǔ)和處理

因?yàn)楝F(xiàn)在越來越多的公司開始逐漸使用PostgreSQL作為公司數(shù)據(jù)庫,這里我們就把數(shù)據(jù)存儲(chǔ)于Postgresql壮莹,為了使我們的整個(gè)項(xiàng)目更加工程化翅帜,我們把對(duì)數(shù)據(jù)庫的操作單獨(dú)定義方法。

# 對(duì)數(shù)據(jù)庫實(shí)現(xiàn)查詢的方法
def execute_select(conn, sql, params=None):
    with conn.cursor() as cur:
        if params:
            cur.execute(sql, params)
        else:
            cur.execute(sql)
        return cur.fetchall()

# 對(duì)數(shù)據(jù)庫實(shí)現(xiàn)增刪改的方法
def execute_sql(conn, sql, params=None):
    with conn.cursor() as cur:
        if params:
            cur.execute(sql, params)
        else:
            cur.execute(sql)

大功告成了一半命满,運(yùn)行代碼 --> 保存數(shù)據(jù)庫 接下來當(dāng)然是對(duì)我們拿下的數(shù)據(jù)進(jìn)行分(hu)析(shuo)展(ba)示(dao)了(千年不變的套路hhhhhh..)


這里我們可以看到數(shù)據(jù)已經(jīng)成功存儲(chǔ)與數(shù)據(jù)庫

4.數(shù)據(jù)的處理和分析

既然說到對(duì)中文數(shù)據(jù)的處理和展示涝滴,我們常用的就幾種方法,詞云胶台、情感分析歼疮、數(shù)據(jù)可視化展示,這里我就必須提到python中比較出名的一個(gè)中文NLP庫:snowNLP诈唬,snowNLP能夠根據(jù)給出的句子生成一個(gè)0-1之間的值韩脏,當(dāng)值大于0.5時(shí)代表句子的情感極性偏向積極,當(dāng)分值小于0.5時(shí)铸磅,情感極性偏向消極赡矢,越偏向兩頭杭朱,情感就越敏感。使用一個(gè)庫最簡(jiǎn)單暴力的方法———讀官方文檔吹散。

snownlp的使用也很簡(jiǎn)單


我隨機(jī)抽取了兩張結(jié)果痕檬,簡(jiǎn)單標(biāo)注了一下,我們不難發(fā)現(xiàn)涉及到主動(dòng)送浊、長得帥、有錢的丘跌、要勇敢袭景、口紅、情商這幾個(gè)詞生成的值都在0.9闭树,矮矬窮耸棒、渣、你他媽這些詞生成的值都在0.5以下报辱,林佳与殃,給我留一口啊碍现!是什么鬼幅疼,竟然0.7?昼接?爽篷?

  • 雖然數(shù)據(jù)量大(其實(shí)是沒有剔除停用詞ヾ(???)ノ)導(dǎo)致的詞云圖效果不太好,但是我們還是可以看到聊天慢睡、主動(dòng)逐工、好看這幾個(gè)詞的詞頻較高,至于為什么我不剔除停用詞漂辐,是因?yàn)闆]有語料庫還是因?yàn)椴粫?huì)用泪喊,都不是,因?yàn)槲覒兴柩模覒刑惶洌覒?.. 剔除停用詞的教程之前寫的文章中有:Python數(shù)據(jù)科學(xué)(三)- python與數(shù)據(jù)科學(xué)應(yīng)用(Ⅲ)
def word_cloud(comment):
    logger.info('制作詞云圖...word_cloud')
    comment_text = ''
    back_coloring = imread("static/heart.jpg")
    cloud = WordCloud(font_path='static/simhei.ttf', 
                      background_color="white",  # 背景顏色
                      max_words=2000,  
                      mask=back_coloring,  
                      max_font_size=100,  
                      width=1000, height=860, margin=2,  
                      random_state=42,
                      )
    for li in comment:
        comment_text += ' '.join(jieba.cut(li, cut_all=False))
    wc = cloud.generate(comment_text)
    image_colors = ImageColorGenerator(back_coloring)
    plt.figure("wordc")
    plt.imshow(wc.recolor(color_func=image_colors))
    wc.to_file('微博評(píng)論詞云圖.png')
  • 對(duì)處理過得情感值列表進(jìn)行統(tǒng)計(jì),并生成分布圖复凳,采集的評(píng)論大概有5w條
def snow_analysis(comment):
    logger.info('自然語言處理NLP...snow_analysis')
    sentimentslist = []
    for li in comment:
        s = SnowNLP(li)
        # logger.debug(li)
        # 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()
微博 一個(gè)人說一個(gè)瘤泪,追女孩的小道理 評(píng)論的情感值分布

可以看到情感值在接近0.6~1.0左右位置頻率較高,說明粉絲們對(duì)于這則微博的評(píng)論積極態(tài)度占大多數(shù)育八,因?yàn)檫@個(gè)微博本身就是偏積極性的对途,得出的結(jié)果也說明了這個(gè)問題。

我們的初衷是為了如何追女孩子髓棋,我就統(tǒng)計(jì)了一下出現(xiàn)比較多的評(píng)論(有博主為了搶熱門頻繁刷評(píng)論实檀?)惶洲,三行代碼就可以搞定,這個(gè)Counter的用法之前也寫過膳犹,傳送門:使用python中的第三方庫Counter

# 使用python的第三方庫
from collections import Counter
userdict = Counter(comment_list)
print(userdict.most_common(8))

1.一定要主動(dòng)啊 不然等女孩子主動(dòng)嗎恬吕!但是主動(dòng)也要適度 別讓對(duì)方覺得害怕…

2.人品要好,三觀要正確须床,責(zé)任感铐料,孝順善良這些內(nèi)在因素也很重要

3.追某個(gè)女孩時(shí) 只追她一個(gè)人 千萬別撩別人

4.言談?dòng)哪L(fēng)趣但不要輕佻

5.對(duì)她當(dāng)女兒養(yǎng)吧

6.女孩子是要用來寵的,不是來跟她講道理的豺旬。

7.多陪她聊天钠惩,多關(guān)心她,愛護(hù)她族阅,保護(hù)她篓跛,了解她,寵她坦刀,尊重她愧沟,給她安全感

8.不要曖昧不清,不要套路

文末彩蛋:

有很多男生抱怨自己追不到喜歡的姑娘鲤遥,追了幾個(gè)星期就放棄了沐寺。其實(shí),要改變的是你自己盖奈,只要努力向上芽丹,讓自己變得更優(yōu)秀,同時(shí)對(duì)姑娘保持適當(dāng)?shù)年P(guān)心和熱情卜朗,堅(jiān)持幾個(gè)月拔第,總有一天你就會(huì)發(fā)現(xiàn),不喜歡就是不喜歡這是沒有辦法的事情场钉。

最后蚊俺,由于這篇博客是2018年第一篇博客,那么就祝大家狗年脫單了~
如果你覺得我的文章還可以逛万,可以關(guān)注我的微信公眾號(hào):Python攻城獅

可掃描二維碼泳猬,添加關(guān)注

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市宇植,隨后出現(xiàn)的幾起案子得封,更是在濱河造成了極大的恐慌,老刑警劉巖指郁,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忙上,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡闲坎,警方通過查閱死者的電腦和手機(jī)疫粥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門茬斧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梗逮,你說我怎么就攤上這事项秉。” “怎么了慷彤?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵娄蔼,是天一觀的道長。 經(jīng)常有香客問我底哗,道長贷屎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任艘虎,我火速辦了婚禮,結(jié)果婚禮上咒吐,老公的妹妹穿的比我還像新娘野建。我一直安慰自己,他們只是感情好恬叹,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布候生。 她就那樣靜靜地躺著,像睡著了一般绽昼。 火紅的嫁衣襯著肌膚如雪唯鸭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天硅确,我揣著相機(jī)與錄音目溉,去河邊找鬼。 笑死菱农,一個(gè)胖子當(dāng)著我的面吹牛缭付,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播循未,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼陷猫,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了的妖?” 一聲冷哼從身側(cè)響起绣檬,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫂粟,沒想到半個(gè)月后娇未,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡星虹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年忘蟹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了飒房。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡媚值,死狀恐怖狠毯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情褥芒,我是刑警寧澤嚼松,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站锰扶,受9級(jí)特大地震影響献酗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坷牛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一罕偎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧京闰,春花似錦颜及、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痊土,卻和暖如春肄扎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赁酝。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國打工犯祠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酌呆。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓雷则,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肪笋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子月劈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359