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


看這篇文章前,我強烈建議你先把右側分類下面python爬蟲下面的其他文章看一下,至少看一下爬蟲基礎和scrapy的,不然可能有些東西不能理解

 

5-14更新

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

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

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

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

 

 

可以看到,這里有很多職位信息。注意,這里當我們點下一頁

 

 

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

 

 

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

 

 

可以看到輸出,你可以把所有源代碼瀏覽一遍,里面沒有任何有關職位的信息!

 

 

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

 

 

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

 

 

尋找可以網頁

這時候要怎么辦呢?難道信息就爬不了嗎??

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

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

 

 

這時候你可能看到里面沒東西,這是因為它只記錄打開后的網絡資源的信息。
我們按F5刷新一下。

 

 

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

 

 

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

 

 

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

 

 

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

 

 

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

網頁構造

通過觀察網頁地址可以發現推測出:
http://www.lagou.com/jobs/positionAjax.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,大家應該很熟悉了

 

 

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


免責聲明!

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



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