5-14更新
注意:目前拉勾網(wǎng)換了json結(jié)構(gòu),之前是content - result 現(xiàn)在改成了content- positionResult - result,所以大家寫(xiě)代碼的時(shí)候要特別注意加上一層positionResult的解析。
現(xiàn)在很多網(wǎng)站都用了一種叫做Ajax(異步加載)的技術(shù),就是說(shuō),網(wǎng)頁(yè)打開(kāi)了,先給你看上面一部分東西,然后剩下的東西再慢慢加載。
所以你可以看到很多網(wǎng)頁(yè),都是慢慢的刷出來(lái)的,或者有些網(wǎng)站隨著你的移動(dòng),很多信息才慢慢加載出來(lái)。這樣的網(wǎng)頁(yè)有個(gè)好處,就是網(wǎng)頁(yè)加載速度特別快(因?yàn)椴挥靡淮渭虞d全部?jī)?nèi)容)。
但是這對(duì)我們寫(xiě)爬蟲(chóng)就不方便了,因?yàn)槟憧偸桥啦坏侥阆胍臇|西!
我們舉個(gè)例子,我因?yàn)樽罱敕治隼淳W(wǎng)有關(guān)職位情況的數(shù)據(jù),所以我上了他們網(wǎng)站:(注意!爬取的內(nèi)容僅限于學(xué)術(shù)交流!請(qǐng)勿用于商業(yè)用途!)
http://www.lagou.com/zhaopin/

可以看到,這里有很多職位信息。注意,這里當(dāng)我們點(diǎn)下一頁(yè)

我們可以發(fā)現(xiàn),網(wǎng)頁(yè)地址沒(méi)有更新就直接加載出來(lái)了?。?/p>

這明顯就是一個(gè)動(dòng)態(tài)頁(yè)面,我們寫(xiě)個(gè)爬蟲(chóng)來(lái)爬一下網(wǎng)頁(yè),看看能得到什么內(nèi)容,現(xiàn)在應(yīng)該能很快寫(xiě)出(搭出)一個(gè)這樣的爬蟲(chóng)吧?(其實(shí)啥也沒(méi)有)

可以看到輸出,你可以把所有源代碼瀏覽一遍,里面沒(méi)有任何有關(guān)職位的信息!

如果你覺(jué)得不直觀,我教你一招,我們簡(jiǎn)單的把它輸出到一個(gè)html看看
/動(dòng)態(tài)加載網(wǎng)頁(yè)爬取/1461237819572.png" width=400px />
就是這么個(gè)情況。。關(guān)鍵部分呢!空的?。?!

尋找可以網(wǎng)頁(yè)
這時(shí)候要怎么辦呢?難道信息就爬不了嗎??
當(dāng)然不是,你要想,它只要是顯示到網(wǎng)頁(yè)上了,就肯定在某個(gè)地方,只是我們沒(méi)找到而已。
只不過(guò),這個(gè)時(shí)候,我們就要費(fèi)點(diǎn)功夫了。我們還是回到剛才的網(wǎng)頁(yè)上去點(diǎn)F12,這時(shí)候,我們用network功能

這時(shí)候你可能看到里面沒(méi)東西,這是因?yàn)樗挥涗洿蜷_(kāi)后的網(wǎng)絡(luò)資源的信息。
我們按F5刷新一下。

你可以看到開(kāi)始唰唰的刷出東西來(lái)了……太快了,我眼睛有點(diǎn)跟不上了,我們等它停下來(lái),我們隨便點(diǎn)個(gè)資源,會(huì)出現(xiàn)右邊的框,我們切換到response

然后我們就開(kāi)始找可疑的網(wǎng)頁(yè)資源。首先,圖片,css什么之類(lèi)的可以跳過(guò),這里有個(gè)訣竅,就是一般來(lái)說(shuō),這類(lèi)數(shù)據(jù)都會(huì)用json存,所以我們嘗試在過(guò)濾器中輸入json

我們發(fā)現(xiàn)了2個(gè)資源感覺(jué)特別像,其中有個(gè)名字直接有position,我們點(diǎn)擊右鍵,在新標(biāo)簽頁(yè)打開(kāi)看看
/動(dòng)態(tài)加載網(wǎng)頁(yè)爬取/1461238727325.png" width=200px />
雖然看上去很亂(密集恐懼癥估計(jì)忍不了)但是實(shí)際上很有條理,全是鍵值對(duì)應(yīng)的,這就是json格式,特別適合網(wǎng)頁(yè)數(shù)據(jù)交換。

這里我們發(fā)現(xiàn)就是這個(gè)了!所有職位信息都在里面,我們趕緊記錄下它的網(wǎng)址
網(wǎng)頁(yè)構(gòu)造
通過(guò)觀察網(wǎng)頁(yè)地址可以發(fā)現(xiàn)推測(cè)出:
http://www.lagou.com/jobs/positionAjax.json?這一段是固定的,剩下的我們發(fā)現(xiàn)上面有個(gè)北京

我們把這里改成上??纯矗梢钥匆?jiàn)又出來(lái)一個(gè)網(wǎng)頁(yè)內(nèi)容,剛好和之前網(wǎng)頁(yè)把工作地改成上海,對(duì)應(yīng)的內(nèi)容一致


所以我們可以得出結(jié)論,這里city標(biāo)簽就代表著你選的工作地點(diǎn),那我們要是把工作經(jīng)驗(yàn),學(xué)歷要求,什么都選上呢??可以直接看到,網(wǎng)址就變了很多
<img
src="https://raw.githubusercontent.com/hk029/blog/master/爬蟲(chóng)/動(dòng)態(tài)加載網(wǎng)頁(yè)爬取/1461239055953.png)
我們直接把這些復(fù)制到剛才我們找到的網(wǎng)頁(yè)上

可以發(fā)現(xiàn)和網(wǎng)頁(yè)內(nèi)容一致

現(xiàn)在我們可以下結(jié)論,我們需要的就是這個(gè)網(wǎng)址:
http://www.lagou.com/jobs/positionAjax.json
然后后面可以加這些參數(shù):
gj=應(yīng)屆畢業(yè)生&xl=大專&jd=成長(zhǎng)型&hy=移動(dòng)互聯(lián)網(wǎng)&px=new&city=上海
通過(guò)修改這些參數(shù),我們就可以獲取不同的職位信息。
<font color=red>注意:</font>這里的構(gòu)造還比較簡(jiǎn)單,有時(shí)候,有些網(wǎng)址的構(gòu)造遠(yuǎn)比這個(gè)復(fù)雜,經(jīng)常會(huì)出現(xiàn)一些你不知道什么意思的id=什么的,這個(gè)時(shí)候,可能這個(gè)id的可能值可能就在別的文件中,你可能還得找一遍,也可能就在網(wǎng)頁(yè)源代碼中的某個(gè)地方。
還有一種情況,可能會(huì)出現(xiàn)time=什么的,這就是時(shí)間戳,這時(shí)候,需要用time函數(shù)構(gòu)造??傊?,要具體情況具體分析。
import time
time.time()
編寫(xiě)爬蟲(chóng)
因?yàn)檫@個(gè)網(wǎng)頁(yè)的格式是用的json,那么我們可以用json格式很好的讀出內(nèi)容。
這里我們切換成到preview下,然后點(diǎn)content——result,可以發(fā)現(xiàn)出先一個(gè)列表,再點(diǎn)開(kāi)就可以看到每個(gè)職位的內(nèi)容。為什么要從這里看?有個(gè)好處就是知道這個(gè)json文件的層級(jí)結(jié)構(gòu),方便等下編碼。

整個(gè)處理的代碼就那么幾句話,可以可出,這里完全和剛才的層級(jí)結(jié)構(gòu)是一致的。先content然后result然后是每個(gè)職位的信息。
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 ''
當(dāng)然還是要引入json
import json

我們可以運(yùn)行看看效果
/動(dòng)態(tài)加載網(wǎng)頁(yè)爬取/1461242703391.png" width=400px />
然后,我們可以把信息存到文件或者數(shù)據(jù)庫(kù)了,那就是之前學(xué)過(guò)的內(nèi)容了。
修改items.py
加入你需要的內(nèi)容

修改settings.py
看你是需要存入數(shù)據(jù)庫(kù)還是文件,之前都說(shuō)過(guò)了
修改pipelines.py
如果需要加入數(shù)據(jù)庫(kù),這里加上數(shù)據(jù)庫(kù)操作,如果需要寫(xiě)入文件,可能不用修改這個(gè)文件
修改parse()
把數(shù)據(jù)加入item,然后yield,大家應(yīng)該很熟悉了

但是,這里還只爬了一個(gè)網(wǎng)頁(yè)的內(nèi)容,對(duì)于更多頁(yè)面的內(nèi)容,怎么獲取呢?我在下篇博客會(huì)有介紹,有興趣的童鞋可以自己試試看如果獲取下一頁(yè)的內(nèi)容,用上面教的查找資源的辦法。