5-14更新
注意:目前拉勾網(wǎng)換了json結(jié)構(gòu),之前是content
- result
現(xiàn)在改成了content
- positionResult
- result
,所以大家寫代碼的時(shí)候要特別注意加上一層positionResult
的解析汹碱。
現(xiàn)在很多網(wǎng)站都用了一種叫做Ajax(異步加載)的技術(shù)腌且,就是說晾虑,網(wǎng)頁打開了挥唠,先給你看上面一部分東西够掠,然后剩下的東西再慢慢加載忠聚。
所以你可以看到很多網(wǎng)頁赂蕴,都是慢慢的刷出來的柳弄,或者有些網(wǎng)站隨著你的移動(dòng),很多信息才慢慢加載出來概说。這樣的網(wǎng)頁有個(gè)好處碧注,就是網(wǎng)頁加載速度特別快(因?yàn)椴挥靡淮渭虞d全部內(nèi)容)。
但是這對我們寫爬蟲就不方便了糖赔,因?yàn)槟憧偸桥啦坏侥阆胍臇|西萍丐!
我們舉個(gè)例子,我因?yàn)樽罱敕治隼淳W(wǎng)有關(guān)職位情況的數(shù)據(jù)放典,所以我上了他們網(wǎng)站:(注意逝变!爬取的內(nèi)容僅限于學(xué)術(shù)交流!請勿用于商業(yè)用途奋构!)
http://www.lagou.com/zhaopin/
可以看到壳影,這里有很多職位信息。注意弥臼,這里當(dāng)我們點(diǎn)下一頁
我們可以發(fā)現(xiàn)宴咧,網(wǎng)頁地址沒有更新就直接加載出來了!醋火!
這明顯就是一個(gè)動(dòng)態(tài)頁面悠汽,我們寫個(gè)爬蟲來爬一下網(wǎng)頁,看看能得到什么內(nèi)容芥驳,現(xiàn)在應(yīng)該能很快寫出(搭出)一個(gè)這樣的爬蟲吧柿冲?(其實(shí)啥也沒有)
可以看到輸出,你可以把所有源代碼瀏覽一遍兆旬,里面沒有任何有關(guān)職位的信息假抄!
如果你覺得不直觀,我教你一招丽猬,我們簡單的把它輸出到一個(gè)html看看
![](https://raw.githubusercontent.com/hk029/blog/master/爬蟲/動(dòng)態(tài)加載網(wǎng)頁爬取/1461237819572.png" width=400px />
就是這么個(gè)情況宿饱。。關(guān)鍵部分呢脚祟!空的C浴!由桌!
尋找可以網(wǎng)頁
這時(shí)候要怎么辦呢为黎?難道信息就爬不了嗎邮丰??
當(dāng)然不是铭乾,你要想剪廉,它只要是顯示到網(wǎng)頁上了,就肯定在某個(gè)地方炕檩,只是我們沒找到而已斗蒋。
只不過,這個(gè)時(shí)候笛质,我們就要費(fèi)點(diǎn)功夫了泉沾。我們還是回到剛才的網(wǎng)頁上去點(diǎn)F12,這時(shí)候经瓷,我們用network功能
這時(shí)候你可能看到里面沒東西爆哑,這是因?yàn)樗挥涗洿蜷_后的網(wǎng)絡(luò)資源的信息。
我們按F5刷新一下舆吮。
你可以看到開始唰唰的刷出東西來了……太快了揭朝,我眼睛有點(diǎn)跟不上了,我們等它停下來色冀,我們隨便點(diǎn)個(gè)資源潭袱,會(huì)出現(xiàn)右邊的框,我們切換到response
然后我們就開始找可疑的網(wǎng)頁資源锋恬。首先屯换,圖片,css什么之類的可以跳過与学,這里有個(gè)訣竅彤悔,就是一般來說,這類數(shù)據(jù)都會(huì)用json存索守,所以我們嘗試在過濾器中輸入json
我們發(fā)現(xiàn)了2個(gè)資源感覺特別像晕窑,其中有個(gè)名字直接有position,我們點(diǎn)擊右鍵卵佛,在新標(biāo)簽頁打開看看
![](https://raw.githubusercontent.com/hk029/blog/master/爬蟲/動(dòng)態(tài)加載網(wǎng)頁爬取/1461238727325.png" width=200px />
雖然看上去很亂(密集恐懼癥估計(jì)忍不了)但是實(shí)際上很有條理杨赤,全是鍵值對應(yīng)的,這就是json格式截汪,特別適合網(wǎng)頁數(shù)據(jù)交換疾牲。
這里我們發(fā)現(xiàn)就是這個(gè)了!所有職位信息都在里面衙解,我們趕緊記錄下它的網(wǎng)址
網(wǎng)頁構(gòu)造
通過觀察網(wǎng)頁地址可以發(fā)現(xiàn)推測出:
http://www.lagou.com/jobs/positionAjax.json?這一段是固定的阳柔,剩下的我們發(fā)現(xiàn)上面有個(gè)北京
我們把這里改成上海看看蚓峦,可以看見又出來一個(gè)網(wǎng)頁內(nèi)容盔沫,剛好和之前網(wǎng)頁把工作地改成上海医咨,對應(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/爬蟲/動(dòng)態(tài)加載網(wǎng)頁爬取/1461239055953.png)
我們直接把這些復(fù)制到剛才我們找到的網(wǎng)頁上
可以發(fā)現(xiàn)和網(wǎng)頁內(nèi)容一致
現(xiàn)在我們可以下結(jié)論沾谓,我們需要的就是這個(gè)網(wǎng)址:
http://www.lagou.com/jobs/positionAjax.json
然后后面可以加這些參數(shù):
gj=應(yīng)屆畢業(yè)生&xl=大專&jd=成長型&hy=移動(dòng)互聯(lián)網(wǎng)&px=new&city=上海
通過修改這些參數(shù),我們就可以獲取不同的職位信息戳鹅。
<font color=red>注意:</font>這里的構(gòu)造還比較簡單均驶,有時(shí)候,有些網(wǎng)址的構(gòu)造遠(yuǎn)比這個(gè)復(fù)雜枫虏,經(jīng)常會(huì)出現(xiàn)一些你不知道什么意思的id=什么的妇穴,這個(gè)時(shí)候,可能這個(gè)id的可能值可能就在別的文件中隶债,你可能還得找一遍腾它,也可能就在網(wǎng)頁源代碼中的某個(gè)地方。
還有一種情況死讹,可能會(huì)出現(xiàn)time=什么的瞒滴,這就是時(shí)間戳,這時(shí)候赞警,需要用time函數(shù)構(gòu)造妓忍。總之愧旦,要具體情況具體分析世剖。
import time
time.time()
編寫爬蟲
因?yàn)檫@個(gè)網(wǎng)頁的格式是用的json,那么我們可以用json格式很好的讀出內(nèi)容忘瓦。
這里我們切換成到preview下搁廓,然后點(diǎn)content——result,可以發(fā)現(xiàn)出先一個(gè)列表耕皮,再點(diǎn)開就可以看到每個(gè)職位的內(nèi)容境蜕。為什么要從這里看?有個(gè)好處就是知道這個(gè)json文件的層級結(jié)構(gòu)凌停,方便等下編碼粱年。
整個(gè)處理的代碼就那么幾句話,可以可出罚拟,這里完全和剛才的層級結(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)行看看效果
![](https://raw.githubusercontent.com/hk029/blog/master/爬蟲/動(dòng)態(tài)加載網(wǎng)頁爬取/1461242703391.png" width=400px />
然后,我們可以把信息存到文件或者數(shù)據(jù)庫了拉队,那就是之前學(xué)過的內(nèi)容了弊知。
修改items.py
加入你需要的內(nèi)容
修改settings.py
看你是需要存入數(shù)據(jù)庫還是文件,之前都說過了
修改pipelines.py
如果需要加入數(shù)據(jù)庫粱快,這里加上數(shù)據(jù)庫操作秩彤,如果需要寫入文件,可能不用修改這個(gè)文件
修改parse()
把數(shù)據(jù)加入item事哭,然后yield漫雷,大家應(yīng)該很熟悉了
但是,這里還只爬了一個(gè)網(wǎng)頁的內(nèi)容鳍咱,對于更多頁面的內(nèi)容降盹,怎么獲取呢?我在下篇博客會(huì)有介紹谤辜,有興趣的童鞋可以自己試試看如果獲取下一頁的內(nèi)容蓄坏,用上面教的查找資源的辦法。