【圖文詳解】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,大家應該很熟悉了
但是,這裡還只爬了一個網頁的內容,對於更多頁面的內容,怎麼獲取呢?我在下篇部落格會有介紹,有興趣的童鞋可以自己試試看如果獲取下一頁的內容,用上面教的查詢資源的辦法。