1. 程式人生 > >34行程式碼爬取微博實時熱搜榜單

34行程式碼爬取微博實時熱搜榜單

微博大家都用著,相信大家也都關注了不少的明星,作為一枚合格的粉絲會經常關注明星的八卦動態。

如何判斷一個明星紅不紅,看她/他上熱搜的次數有多少!!!當然了現在微博的熱搜也變味了,不僅僅靠資料統計彙總,大明星隨隨便便花點兒錢就能買個熱搜霸榜幾個小時,反而是一些真實需要關注的事兒卻上不了熱搜,比如前段時間發生的3種顏色上不了熱搜。

咳咳!!!扯得有點兒遠了。

記住!這是個技術貼!言歸正傳~

今天給大家展示一下,本人是如何通過34行程式碼爬取微博熱搜榜的,程式碼有點兒齪,各位見諒!先上一張目前微博實時熱搜榜的圖,我只截了一半的圖,實際榜單有50條。


頁面連結我就不貼了,如果說您老連微博熱搜榜的頁面在哪裡,都找不到,請出門左轉不送!!!

好,我們的目標是通過程式碼把實時熱搜榜的榜單爬下來,包括排名、關鍵詞、連結、搜尋指數。

第一步:準備開發環境

開發語言:python2.7框架或lib:  Scrapy 和  BeautifulSoup (其實BeautifulSoup就可以直接處理,Scrapy有點兒大材小用了)

開發工具:Visual Studio Code 或者 PyCharm 兩者都可以

我們通過Virtualenv來構造python的執行環境。

virtualenv 為每個不同專案提供一份 Python 安裝。它並沒有真正安裝多個 Python 副本,但是它確實提供了一種巧妙的方式來讓各專案環境保持獨立。

如果你在 Mac OS X 或 Linux 下,下面兩條命令可能會適用:

$ sudo easy_install virtualenv

或更好的:

$ sudo pip install virtualenv

上述的命令會在你的系統中安裝 virtualenv。

它甚至可能會存在於包管理器中, 如果你用的是 Ubuntu,可以嘗試:

$ sudo apt-get install python-virtualenv

如果你用的是 Windows ,而且沒有 easy_install 命令,那麼你必須先安裝這個命令。查閱Windows 下的 pip 和 distribute如何安裝。之後,執行上述的命令,但是要去掉 sudo 字首。

virtualenv 安裝完畢後,你可以立即開啟 shell 然後建立你自己的環境。我通常建立一個專案資料夾,並在其下建立一個 venv 資料夾

$ mkdir weibo

$ cd weibo

$ virtualenv venvNew python executable in venv/bin/pythonInstalling distribute............done.

現在,無論何時你想在某個專案上工作,只需要啟用相應的環境。

在 OS X 和 Linux 上,執行如下操作:

$ . venv/bin/activate

下面的操作適用 Windows:

$ venv\scripts\activate

無論通過哪種方式,你現在應該已經激活了 virtualenv(注意你的 shell 提示符顯示的是當前活動的環境)。


專案結構如下:

weibo----父目錄

        venv----子目錄

第二步:安裝 Scrapy 和 BeautifulSoup

使用pip安裝Scrapy,安裝教程

pip install Scrapy

使用pip安裝BeautifulSoup,安裝教程

pip install beautifulsoup4

在開始爬取之前,您必須建立一個新的Scrapy專案,進入weibo的資料夾中,執行如下命令:

scrapy startproject wb

此時的資料夾結構如下圖:


在spiders中新建wb_spider.py的python檔案,我們的34行核心程式碼都寫在這個裡面。好,準備工作都已經就緒,剩下的工作就是分析頁面結構。

第三步:分析微博實時熱搜榜頁面結構

在谷歌瀏覽器中開啟微博熱搜榜頁面,F12開啟開發者工具,通過滑鼠選擇如下:


可以看到整個熱搜榜是包在一個ID為realtimehot的Table標籤裡面,然後每一個tr標籤裡面包含一行榜單資訊。


好了,我們的目標是從頁面中找到整個個Table標籤,並且通過程式碼把想要的資料解析出來,ok。當我們在微博熱搜榜的頁面,右鍵->檢視原始碼 的時候發現,伺服器返回的頁面並不包含這個ID為realtimehot的Table標籤。


出現這種情況,一般肯定是通過Ajax載入或者動態操作Dom生成標籤的,我們通過開發者工具檢視網路並沒有發現相關的資料請求,最後在網頁原始碼底部發現幾個指令碼程式碼,在這些指令碼程式碼中找到了ID為realtimehot的Table標籤,見下圖:


好了,到此為止,整個分析過程結束,開始進入編碼階段。

第四步: 編寫解析程式碼

先上程式碼截圖:


程式碼解釋:

class WbSpider(scrapy.spiders.Spider):爬蟲(Spider)類,不明白的童鞋,點這裡

name = "weibo":爬蟲的名稱,一個爬蟲一個名稱,唯一的。

start_urls=[ "http://s.weibo.com/top/summary?cate=realtimehot"]:包含了Spider在啟動時進行爬取的url列表。

rhtml = response.xpath('//script/text()').extract():變數瞎定義的,大家將就著看,獲取整個頁面的script的字串資訊。

htm = rhtml[8]:獲取目標ID為realtimehot的Table的指令碼資訊,為什麼是8呢?我在頁面數的。

start = htm.find("(") substr = htm[start+1:-1]:擷取腳本里面的json串資訊。

self.getData(text["html"]):此時就獲取到了我們需要的Table的html標籤結構了。

def getData(self,text)::此方法主要就是解析Table標籤,獲取目標資訊,此處主要使用的是BeautifulSoup進行解析的。

整個程式碼解析完成,上最終效果圖:


本文為碼農之家原創,獲取授權轉載。