一、環(huán)境:
python3.+
在IDLE中(pycharm也可)
二喇聊、目標(biāo):
爬取拉勾網(wǎng)的python相關(guān)職位信息芜飘。
三务豺、思路:
當(dāng)準(zhǔn)備爬取某網(wǎng)站數(shù)據(jù)時,應(yīng)明確一下思路嗦明,爬蟲是使用程序模擬人的瀏覽器操作獲取數(shù)據(jù)的過程笼沥。所有的操作都是圍繞著請求與響應(yīng)。
四娶牌、步驟:
1奔浅、打開拉勾網(wǎng),在搜索框中輸入python诗良,如圖:
紅框中的每一行就是一個個的項(xiàng)目信息汹桦,我們就是要爬取這些信息。
2鉴裹、打開命令行舞骆,輸入 pip install requests 安裝requests庫钥弯,用于網(wǎng)絡(luò)請求
在進(jìn)入網(wǎng)頁的時候,有人會使用Get方式請求督禽,并將當(dāng)前的網(wǎng)頁直接作為目標(biāo)url脆霎,會直接被服務(wù)器給pass掉,因?yàn)檎鎸?shí)的瀏覽器在訪問時一定會帶有一些參數(shù)的狈惫,故而在請求方式與參數(shù)都不正確的情況下睛蛛,服務(wù)器自然判定為爬蟲,不會返回正確的數(shù)據(jù)胧谈。
3忆肾、此時,可按F12查看當(dāng)前網(wǎng)頁中的NetWork項(xiàng)菱肖,一般的前端在請求數(shù)據(jù)的過程客冈,都是先請求個大的網(wǎng)頁框架,然后在容器中進(jìn)一步發(fā)送請求蔑滓,才能獲得容器內(nèi)部的數(shù)據(jù)郊酒,一般會采用Ajax請求,所以可以點(diǎn)擊XHR键袱,找到其中的positionAjax查看真實(shí)的url、headers以及formData此三項(xiàng)摹闽。
如圖:
那么如何爬取呢蹄咖?
打開python的IDLE:
按下Ctil + N進(jìn)入編輯模式
注意:
使用IDEL需要先保存,再按F5運(yùn)行付鹿。
為了更好的模仿瀏覽器去請求數(shù)據(jù)澜汤,在請求一次網(wǎng)頁之后,我們給爬蟲隨機(jī)休眠一段時間舵匾。
我們所需要的數(shù)據(jù)就在上圖中的Preview(Headers右邊)中俊抵,如下圖。
所寫爬蟲代碼如下:
#coding:gbk
import requests #導(dǎo)入網(wǎng)絡(luò)請求庫
import random #導(dǎo)入隨機(jī)數(shù)庫
#這才是真實(shí)的url
url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
#請求頭中的這些參數(shù)一般被用來做反爬的判斷依據(jù)徽诲,每個人的User-Agent是不一樣的
the_headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
'Referer':'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=',
'Host':'www.lagou.com',
'X-Anit-Forge-Code':'0',
'X-Anit-Forge-Token':None,
'X-Requested-With':'XMLHttpRequest'
}
#循環(huán)爬取30頁的數(shù)據(jù)
for pages in range(1,31):
#post請求中要帶上一些參數(shù)
the_data = {
'first':'true',
'pn':pages,
'kd':'python'
}
#向服務(wù)器請求數(shù)據(jù)
result = requests.post(url, headers = the_headers, data = the_data)
jsonResult = result.json()
#我們想要的數(shù)據(jù)內(nèi)容就從下面的關(guān)鍵字中一個層級一個層級的向下找
json_result = jsonResult['content']['positionResult']['result']
print(json_result)
#為了模擬真實(shí)的瀏覽器操作,需要不定時休眠
random.randint(20,36)
print('所有頁面爬取成功')
結(jié)果:
如上圖所示吵血,已經(jīng)爬取了很多頁了谎替,但是后面幾頁還是出了問題,問題在于休眠的時間設(shè)置的不夠長蹋辅,還是被服務(wù)器判別出了爬蟲钱贯,因此不進(jìn)行響應(yīng),只需要在休眠時間上放的更久即可侦另,本程序中使用的休眠時間是20秒到36秒秩命,可以嘗試40秒到60.
結(jié)束尉共。