Python數據採集案例(1):微博熱搜榜採集

作者:長行

時間:2020.05.25

實現目標

本案例通過圖文詳細介紹網絡請求和解析的方法,其目標實現的需求爲:通過網絡請求,獲取微博熱搜榜中的前50條熱搜的關鍵詞,並將結果打印到控制檯中。

實現過程

總體來說,數據採集爬蟲的實現過程包括如下步驟:

  • 確定數據所在的Url
  • 執行網頁請求並解決請求中出現的問題
  • 解析網頁,獲取格式化數據
  • 存儲數據(當前案例中不需要)

下面我們按着以上步驟來依次完成。

確定數據所在Url

打開微博熱搜榜,即Url爲:https://s.weibo.com/top/summary

在這裏插入圖片描述

首先,我們需要判斷目標數據是存在於頁面上,還是通過Ajax加載的。我們可以在瀏覽器(建議使用Chrome瀏覽器)中右鍵,選擇“查看網頁源代碼”。

在這裏插入圖片描述

此時瀏覽器會打開新的頁面,其Url(網頁地址)前增加了view-source部分,在網頁中顯示的關鍵詞就是當前網頁的源代碼。

在這裏插入圖片描述

我們使用快捷鍵Ctrl+F打開搜索框,在網頁源代碼中搜索熱搜榜頁面上顯示的文字,例如熱搜排名第一的”北宋古墓發現過仙橋“,可以發現網頁源代碼中存在該關鍵詞,這就說明熱搜榜是直接加載在頁面中,而不是通過Ajax加載的,此時我們只要直接請求網頁的Url即可獲得熱搜榜數據。

網頁請求

下面我們使用requests模塊執行網頁請求,並打印請求的結果,其代碼如下:

import requests

if __name__ == "__main__":
    response = requests.get("https://s.weibo.com/top/summary")
    print(response.content.decode())

在打印出的內容中,我們再一次通過搜索找到了”北宋古墓發現過仙橋“,說明我們的請求成功獲得了熱搜榜數據,並沒有出現任何問題。

網頁解析

在這裏插入圖片描述

再次回到瀏覽器,右鍵,選擇“檢查”,打開瀏覽器控制檯(或直接使用快捷鍵F12也可以打開控制檯)。

在這裏插入圖片描述

選中元素選取工具。

在這裏插入圖片描述

在元素選取模式下(元素選取工具的小箭頭爲藍色),點擊我們需要採集的信息。

在這裏插入圖片描述

此時,瀏覽器控制檯將定位到目標信息所在的標籤。

在這裏插入圖片描述

我們在該標籤上右鍵,選擇“Copy“,再選擇”Copy Selector“,複製標籤的CSS Selector路徑,這個路徑是用來定位到當前標籤的。例如,第一條熱搜關鍵詞所在標籤的CSS Selector爲:

#pl_top_realtimehot > table > tbody > tr:nth-child(2) > td.td-02 > a

其中#pl_top_realtimehot表示ID爲pl_top_realtimehot的標籤,即下圖中第一行的div標籤;> table表示當前標籤下一層的table標籤,即下圖中第二行的table標籤;tr:nth-child(2)表示當前標籤下的第二個tr標籤,即下圖中被選中的tr標籤。

在這裏插入圖片描述

通過對於網絡結構的觀察,我們可以發現每條熱搜都是tbody標籤下的一個獨立的tr標籤;因此,要同時獲取不同熱搜的關鍵詞,我們只需要不再限制指定的tr標籤即可,即將CSS selector路徑中tr:nth-child(2)中的:nth-child(2)刪除即可。

#pl_top_realtimehot > table > tbody > tr > td.td-02 > a

在瀏覽器控制檯的Elements標籤中,使用Ctrl+F快捷鍵打開搜索框,在搜索框中搜索修改後的CSS Selector路徑,可以得到51個結果,說明修改後的CSS Selector已經可以同時匹配所有熱搜的關鍵詞了。

在這裏插入圖片描述

下面我們使用Python的第三方模塊——BeautifulSoup模塊(pip安裝命令 : pip install BeautifulSoup4)實現解析,包含請求的代碼如下:

import requests
from bs4 import BeautifulSoup

if __name__ == "__main__":
    response = requests.get("https://s.weibo.com/top/summary")
    bs = BeautifulSoup(response.content.decode(), 'lxml')
    for keyword_label in bs.select("#pl_top_realtimehot > table > tbody > tr > td.td-02 > a"):
        print(keyword_label.text)

運行結果已經可以將所有熱搜打印到控制檯中,實現了當前需求。

10個關鍵詞把握2020中國經濟走勢
北宋古墓發現過仙橋
香港各界發起聯署支持國家安全立法
馬路驚現非洲雄獅
澳門所有大中小學升國旗唱國歌全覆蓋
......

本系列案例採集的一切數據僅可用於學習、研究用途!

對於案例需求的說明 : 因此微博熱搜榜是實時更新的,所以一個相對完整的採集需求如下:每3分鐘採集一次微博熱搜榜中的前49條熱搜(忽略第3條的廣告信息),並將結果存儲到數據庫中,數據庫應至少包含採集時間、排名(rank)、關鍵詞(keyword)、熱度(hot)、類型(type)等字段。完整案例將在後續內容中講解。

對於案例講解的說明 : 作爲第一個案例,本文通過圖文詳細講解了每一個步驟,後續的案例將以講解思路爲主。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章