如何用 Python 爬取微博評論,通過王某宏事件來手把手教學


今年某圈真熱鬧,一個料還沒過多久一個新料就被爆出來了,吃瓜群眾是吃了一茬又一茬

本來公號沒有打算寫關於 王某宏 相關的技術文,但周末看網友對此事件熱度不減,並且熱點聚焦在於微博上,之前呢也沒采集過微博的相關數據,剛好借此學習一下

一方面可以借機蹭個熱度(雖然熱度已經算是過去了),另一方面可以學一下新知識,這樣做一件事就有雙倍快樂 ~,本文主要通過采集了女主最熱微博下的部分評論數據,以技術角度對本事件做了簡單的可視化分析。

介紹一下本文用到的技術棧:

語言、框架:Python、Vue;

數據存儲:MongoDB、txt;

庫: WordCloud、jieba、bs4 等;

數據采集

數據是后面所有可視化分析的前提,本文采集的是 女主石錘王某宏的那條微博,9張圖總字數達近5000,信息量很大,目前下方評論數量已達 40 萬左右

這里借助的是微博老式網頁版提供的接口,基本沒有什么反爬措施,需要在請求頭中加入 Cookie、User-Agent 參數即可,,但還是提醒一點不要訪問太過頻繁,否則會返回 403 狀態碼。核心代碼如下

headers = {
    "Cookie":"你的Cookie",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",
    "Accept-Language": "h-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6",
    "Accept":"application/json",
    "Content-Type":"application/json;charset=UTF-8",
    "refer": "https://weibo.cn/",
}

def parseUrl(page):
    url = "https://weibo.cn/comment/hot/L6w2sfDXb"
    params = {
        "rl": 1,
        "page": page,
    }
    if(page != 1):
        # 更換 refer
        headers['refer'] = "https://weibo.cn/comment/hot/L6w2sfDXb?rl=1&page={}".format(page-1)
    # 格式轉換;
    res = requests.get(url =url,headers=headers,params=params)
    print("request url is {}  page is {} response status is {}".format(url,page,res.status_code))
    resText = res.content.decode(encoding='utf-8')
    soup = BeautifulSoup(resText,'lxml')
    # select 正則匹配
    for comment_item in soup.select('div[id^="C_"]'):
        userName = comment_item.contents[0].text
        comment = comment_item.contents[-9].text
        likeInfo = comment_item.contents[-5].text
        timeInfo = comment_item.contents[-1].text.split("\xa0")[0]

        data_info  = {
            "userName": userName,
            "comment": comment,
            "likeCount": likeInfo,
            "timeInfo": timeInfo
        }
        if not (collection.find_one({"userName":userName})):
            '''查詢之前進行一次過濾'''
            print("data _json is {}".format(data_info))
            collection.insert_one(data_info)


if __name__ =='__main__':
    # 爬取之前清空數據庫
    collection.delete_many({})
    time_unit = [0.5,1,2,0.2,0.4,1.2,1.3,0.9]
    for i in  range(100000):
    	time.sleep(random.choice(time_uint))

        parseUrl(page=i)


需要說明一下,此接口采用分頁機制;即使訪問的是不同頁碼下的 url,但采集到的的數據依舊會出現大量重復現象,所以在保存之前或者數據清洗時,建議做一下去重處理:

image-20211220001926341

從上圖可以看到,微博為了呈現好一點的可視化效果, timeInfo 字段(代表評論時間)是中文+字符方式展示,在數據可視化之前,需要先做一個時間格式轉換,統一與 2021-12-18 05:07:00 相一致,這里我寫了個簡單的轉換函數:

def conver_timeformat(timeStr):
    '時間格式轉換'
    if "今天" in timeStr:
        result  = re.search("今天[\s\S](\d{1,2}):(\d{1,2})",timeStr)
        if(len(result.groups()) ==2):
            timeInfo = format(datetime(year=2021,
                                month=12,
                                day=19,
                                hour=int(result.group(1)),
                                minute= int(result.group(2)),
                                second=0),
                              "%Y-%m-%d %H:%M:%S")
        else:
            timeInfo = format(datetime.now(),"%Y-%m-%d %H:%M:%S")
        return timeInfo
    if "分鍾" in timeStr:
        timeInfo = format(datetime.now(), "%Y-%m-%d %H:%M:%S")
        return  timeInfo

    if "月" in timeStr:
        result = re.search("(\d{1,2})月(\d{1,2})日[\s\S](\d{1,2}):(\d{1,2})", timeStr)
        if (len(result.groups()) == 4):
            timeInfo = format(datetime(year=2021,
                                       month=int(result.group(1)),
                                       day=int(result.group(2)),
                                       hour=int(result.group(3)),
                                       minute=int(result.group(4)),
                                       second= 0),
                              "%Y-%m-%d %H:%M:%S")
            return timeInfo
    raise RuntimeError("{} 時間格式無法轉換".format(timeStr))

可視化分析

評論時間分布

首先,本文對評論的時間分布做一個可視化展示,效果如下:

image-20211220005014501

可能采集的數據樣本只限於熱評【點贊指標】部分,因此時間分布方面出現極大均衡性,整體上評論數集中於兩個時間點:17日的 23 時刻,20 日的 0點時刻,而這兩個點分別對應女方首次發微博錘男方不端、男方就此事件首次做出回應,,而此時的我正在寫這篇文章😢

詞雲可視化

想看看網友針對此件事情在女方微博都評論了些什么,這里通過兩張詞雲圖簡單匯總下:

image-20211220011657985

加油總結支持轉移財產 是這張圖頻率出現最多的詞語,都是對女主的鼓勵,滿滿都是正能量

image-20211220011958518

看到這張詞雲圖后,emm怎么說呢,與前面一張詞雲圖對比一下,這張圖滿滿都是對男主的行為的控訴,這張圖比較突出的幾個詞大家自己看吧,這里就不點出來了;另外圖中模糊區域是對某些不是很恰當的詞語打了下碼。

最后,根據評論點贊數對網友評論做了排序,這里選取了其中幾個,貼在下方:

獲贊個數【97961】

13年結婚14年一胎16年二胎18年三胎……八年婚姻 懷孕生產月子奶娃養娃幾乎占據了全部……到頭來……做女生 實慘 很討厭 不喜歡 很煩

--- 利德森醫療

獲贊個數【230668】

原來你這么不容易!他居然在玩人設?還能相信感情嗎??都怎么了這些人一個個的…唉…'

--- 美女不能禿頭

獲贊個數【9663】

張愛玲曾寫下: 最難熬的日子,都過去了 那種閉着眼,都流淚的感覺 這一輩子都不想再體會了 如今已不再奢求什么陪伴 因為下雨天,連影子都會離開 始於心甘情願,終於願賭服輸 生不逢時,愛不逢人 所到之處皆是命數 希望以后的日子里 百毒不侵,活的認真, 笑的放肆 抬頭遇見的都是柔情@李靚蕾Jinglei

--- Nicole甜兒

小結

本文源碼數據獲取方式,關注微信公眾號【小張Python】,后台回復關鍵字:211220 即可

好了,以上就是本文的全部內容了,如果對你有所幫助的話,不妨點個贊就是對我最大的鼓勵,下期見~

注:本文內容不代表任何立場,僅供學習知識分享,望周知!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM