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進行解析的。
整個程式碼解析完成,上最終效果圖: