Python採集微博熱評進行情感分析祝你狗年脫單

一隻寫程式的猿發表於2018-01-10

Ps: 重要的事情說三遍!!! 結尾有彩蛋,結尾有彩蛋,結尾有彩蛋。

如果自己需要爬**(cai)(ji)的資料量比較大,為了防止被網站封Ip,可以分時段爬取,另外對於爬到的資料一般是用來儲存資料庫,這就需要對資料進行去重處理,記錄上次爬取的狀態,就可以實現在爬蟲中斷後,可以快速繼續上次的狀態,實現增量爬取,這裡可以參考我之前寫過的一個新聞採集,增量採集新聞資料,本文寫的對新浪微博的資料採集和處理完整程式碼在我的Github。** 玩微博的人大多數應該知道微博搞笑排行榜的,剛好寫這篇文之前看到榜姐1月8號0點話題是**一人說一個,追女孩的小道理**,感覺這個話題簡直是對廣大單身男性的福利啊,ヾ(✿゚▽゚)ノ,故有了何不就採集一下評論來分析一波的想法。

1.使用新浪微博提供的API對資料進行採集

作為一個爬蟲菜鳥來說,如果不會使用代理IP池,同時對網站的反爬機制不太清楚,建議先去看下網站是否自己提供的有API,今天我們要爬取的網站是新浪微博,當然新浪網作為為全球使用者24小時提供全面及時的中文資訊的大網站,一定是提供自己的API介面的。這樣的大網站,必定是經歷了無數場爬蟲與反爬之間的戰爭,也一定有很健全的反爬策略,所以我們可以通過呼叫新浪微博的開放平臺來獲取我們想要的資訊。使用之前請詳細閱讀API文件,在開放平臺認證為開發者,附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' #回撥連結 

# 在網站設定"使用微博賬號登陸"的連結,當使用者點選連結後,引導使用者跳轉至如下地址  
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後面的內容後按Enter鍵:'

code = raw_input() # 人工輸入網址後面的code內容  
r = client.request_access_token(code)  # 獲得使用者授權 
access_token = r.access_token   # 新浪返回的token,類似abc123xyz456
expires_in = r.expires_in
# 設定得到的access_token,client可以直接呼叫API了
client.set_access_token(access_token, expires_in)
複製程式碼

獲取某個使用者最新發表的微博列表

Python採集微博熱評進行情感分析祝你狗年脫單

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格式的

{
    "statuses": [
        {
            "created_at": "Tue May 31 17:46:55 +0800 2011",
            "id": 11488058246,
            "text": "求關注。""source": "<a href="http://weibo.com" 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": "北京 朝陽區",
                "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:
         text = info.text
複製程式碼

2.新浪微博爬蟲

chrome瀏覽器右鍵檢查檢視network這些老套路我就不說了,不懂得可以翻Python網路爬蟲(一)- 入門基礎 從頭開始看。 另外:程式碼是針對新浪微博移動端 m.weibo.cn/ 進行資訊採集,之所以爬移動端而不是PC所有社交網站爬蟲,優先選擇爬移動版(不要來問我為什麼好爬,我也不知道 逃

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

Python採集微博熱評進行情感分析祝你狗年脫單

點來連結https://m.weibo.cn/single/rcListformat=cards&id=4193705642468999&type=comment&hot=0&page=2即為返回的json格式的資料

接下來直接上程式碼

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  # 第幾條評論
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:
        if params:
            cur.execute(sql, params)
        else:
            cur.execute(sql)
        return cur.fetchall()

# 對資料庫實現增刪改的方法
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):
    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('微博評論詞雲圖.png')
複製程式碼

Python採集微博熱評進行情感分析祝你狗年脫單

  • 對處理過得情感值列表進行統計,並生成分佈圖,採集的評論大概有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()
複製程式碼

微博 一個人說一個,追女孩的小道理 評論的情感值分佈

可以看到情感值在接近0.6~1.0左右位置頻率較高,說明粉絲們對於這則微博的評論積極態度佔大多數,因為這個微博本身就是偏積極性的,得出的結果也說明了這個問題。

我們的初衷是為了如何追女孩子,我就統計了一下出現比較多的評論(有博主為了搶熱門頻繁刷評論?),三行程式碼就可以搞定,這個Counter的用法之前也寫過,傳送門:使用python中的第三方庫Counter

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

1.一定要主動啊 不然等女孩子主動嗎!但是主動也要適度 別讓對方覺得害怕…

2.人品要好,三觀要正確,責任感,孝順善良這些內在因素也很重要

3.追某個女孩時時 只追她一個人 千萬別撩別人

4.言談幽默風趣但不要輕佻

5.對她當女兒養吧

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

7.多陪她聊天,多關心她,愛護她,保護她,瞭解她,寵她,尊重她,給她安全感

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

文末彩蛋:

有很多男生抱怨自己追不到喜歡的姑娘,追了幾個星期就放棄了。其實,要改變的是你自己,只要努力向上,讓自己變得更優秀,同時對姑娘保持適當的關心和熱情,堅持幾個月,總有一天你就會發現,不喜歡就是不喜歡這是沒有辦法的事情。

Python採集微博熱評進行情感分析祝你狗年脫單

最後,由於這篇部落格是2018年第一篇部落格,那麼就祝大家狗年脫單了~

相關文章