看這篇文章前,我強烈建議你先把右側分類下面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,大家應該很熟悉了
但是,這里還只爬了一個網頁的內容,對於更多頁面的內容,怎么獲取呢?我在下篇博客會有介紹,有興趣的童鞋可以自己試試看如果獲取下一頁的內容,用上面教的查找資源的辦法。
