1. 程式人生 > >【圖文詳解】scrapy爬蟲與動態頁面——爬取拉勾網職位資訊(1)

【圖文詳解】scrapy爬蟲與動態頁面——爬取拉勾網職位資訊(1)

5-14更新

注意:目前拉勾網換了json結構,之前是content - result 現在改成了content- positionResult - result,所以大家寫程式碼的時候要特別注意加上一層positionResult的解析。

現在很多網站都用了一種叫做Ajax(非同步載入)的技術,就是說,網頁打開了,先給你看上面一部分東西,然後剩下的東西再慢慢載入。
所以你可以看到很多網頁,都是慢慢的刷出來的,或者有些網站隨著你的移動,很多資訊才慢慢加載出來。這樣的網頁有個好處,就是網頁載入速度特別快(因為不用一次載入全部內容)。

但是這對我們寫爬蟲就不方便了,因為你總是爬不到你想要的東西!

我們舉個例子,我因為最近想分析拉勾網有關職位情況的資料,所以我上了他們網站:(注意!爬取的內容僅限於學術交流!請勿用於商業用途!)

可以看到,這裡有很多職位資訊。注意,這裡當我們點下一頁

我們可以發現,網頁地址沒有更新就直接加載出來了!!

這明顯就是一個動態頁面,我們寫個爬蟲來爬一下網頁,看看能得到什麼內容,現在應該能很快寫出(搭出)一個這樣的爬蟲吧?(其實啥也沒有)

可以看到輸出,你可以把所有原始碼瀏覽一遍,裡面沒有任何有關職位的資訊!

如果你覺得不直觀,我教你一招,我們簡單的把它輸出到一個html看看

就是這麼個情況。。關鍵部分呢!空的!!!

尋找可以網頁

這時候要怎麼辦呢?難道資訊就爬不了嗎??

當然不是,你要想,它只要是顯示到網頁上了,就肯定在某個地方,只是我們沒找到而已。

只不過,這個時候,我們就要費點功夫了。我們還是回到剛才的網頁上去點F12,這時候,我們用network功能

這時候你可能看到裡面沒東西,這是因為它只記錄開啟後的網路資源的資訊。
我們按F5重新整理一下。

你可以看到開始唰唰的刷出東西來了……太快了,我眼睛有點跟不上了,我們等它停下來,我們隨便點個資源,會出現右邊的框,我們切換到response

然後我們就開始找可疑的網頁資源。首先,圖片,css什麼之類的可以跳過,這裡有個訣竅,就是一般來說,這類資料都會用json存,所以我們嘗試在過濾器中輸入json

我們發現了2個資源感覺特別像,其中有個名字直接有position,我們點選右鍵,在新標籤頁開啟看看

雖然看上去很亂(密集恐懼症估計忍不了)但是實際上很有條理,全是鍵值對應的,這就是json格式,特別適合網頁資料交換。

這裡我們發現就是這個了!所有職位資訊都在裡面,我們趕緊記錄下它的網址

網頁構造

我們把這裡改成上海看看,可以看見又出來一個網頁內容,剛好和之前網頁把工作地改成上海,對應的內容一致

所以我們可以得出結論,這裡city標籤就代表著你選的工作地點,那我們要是把工作經驗,學歷要求,什麼都選上呢??可以直接看到,網址就變了很多

import time
time.time()

編寫爬蟲

因為這個網頁的格式是用的json,那麼我們可以用json格式很好的讀出內容。
這裡我們切換成到preview下,然後點content——result,可以發現出先一個列表,再點開就可以看到每個職位的內容。為什麼要從這裡看?有個好處就是知道這個json檔案的層級結構,方便等下編碼。

整個處理的程式碼就那麼幾句話,可以可出,這裡完全和剛才的層級結構是一致的。先content然後result然後是每個職位的資訊。

        jdict = json.loads(response.body)
        jcontent = jdict["content"]
        jresult = jcontent["result"]
        for each in jresult:
            print each['city']
            print each['companyName']
            print each['companySize']
            print each['positionName']
            print each['positionType']
            print each['salary']
            print ''

當然還是要引入json

    import json

我們可以執行看看效果

然後,我們可以把資訊存到檔案或者資料庫了,那就是之前學過的內容了。

修改items.py

加入你需要的內容

修改settings.py

看你是需要存入資料庫還是檔案,之前都說過了

修改pipelines.py

如果需要加入資料庫,這裡加上資料庫操作,如果需要寫入檔案,可能不用修改這個檔案

修改parse()

把資料加入item,然後yield,大家應該很熟悉了

但是,這裡還只爬了一個網頁的內容,對於更多頁面的內容,怎麼獲取呢?我在下篇部落格會有介紹,有興趣的童鞋可以自己試試看如果獲取下一頁的內容,用上面教的查詢資源的辦法。