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

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

 

5-14更新html

注意:目前拉勾網換了json結構,以前是`content` - `result` 如今改爲了`content`- `positionResult` - `result`,因此你們寫代碼的時候要特別注意加上一層`positionResult`的解析。java

如今不少網站都用了一種叫作Ajax(異步加載)的技術,就是說,網頁打開了,先給你看上面一部分東西,而後剩下的東西再慢慢加載。
因此你能夠看到不少網頁,都是慢慢的刷出來的,或者有些網站隨着你的移動,不少信息才慢慢加載出來。這樣的網頁有個好處,就是網頁加載速度特別快(由於不用一次加載所有內容)。
python

可是這對咱們寫爬蟲就不方便了,由於你老是爬不到你想要的東西!數據庫

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

 

 

能夠看到,這裏有不少職位信息。注意,這裏當咱們點下一頁markdown

 

 

咱們能夠發現,網頁地址沒有更新就直接加載出來了!!網絡

 

 

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

 

 

能夠看到輸出,你能夠把全部源代碼瀏覽一遍,裏面沒有任何有關職位的信息!異步

 

 

若是你以爲不直觀,我教你一招,咱們簡單的把它輸出到一個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,你們應該很熟悉了

 

 

可是,這裏還只爬了一個網頁的內容,對於更多頁面的內容,怎麼獲取呢?我在下篇博客會有介紹,有興趣的童鞋能夠本身試試看若是獲取下一頁的內容,用上面教的查找資源的辦法。

相關文章
相關標籤/搜索