二十八. 模擬登陸實戰(zhàn) - 爬取拉勾網(wǎng)招聘信息

爬取網(wǎng)址:https://www.lagou.com/
爬取信息:工作崗位等信息
爬取方式:json數(shù)據(jù)
存儲方式:MongoDB

拉勾網(wǎng)采用了異步加載技術(shù)和提交表單,可通過逆向工程爬取招聘信息履植,并存儲在MongoDB數(shù)據(jù)庫中架专。
①拉勾網(wǎng)上關(guān)于Python的招聘信息如下:


image.png

②通過“查看網(wǎng)頁源代碼”资柔,可以看出網(wǎng)頁元素不在網(wǎng)頁源代碼中溉苛,說明網(wǎng)頁采用了Ajax技術(shù)渺绒。


image.png

③此時可打開Chrome的開發(fā)者工具仅炊,選擇Network選項卡斗幼,選中XHR項,就可以看到加載招聘信息的文件抚垄。在Headers中可以看到請求的網(wǎng)址蜕窿,在Response中可以看到返回的信息,信息為Json格式督勺。Json數(shù)據(jù)需要登錄后才能訪問渠羞,若未登錄,看不到相關(guān)信息智哀。


image.png

image.png

image.png

④json信息比較復(fù)雜次询,還可以使用Preview標(biāo)簽來觀察。


image.png

⑤點擊“下一頁”或者指定頁數(shù)瓷叫,網(wǎng)址并未改變屯吊,即網(wǎng)頁也使用了Ajax技術(shù)。


image.png

⑥打開Chrome的開發(fā)者工具摹菠,選擇Network選項卡盒卸,選中XHR項,可以看到翻頁后的請求URL也沒變化次氨。究其原因蔽介,是因為網(wǎng)頁使用了Post的請求方法,可在提交表單數(shù)據(jù)中觀察到pn字段發(fā)生變化。


image.png

image.png

⑦通過Preview標(biāo)簽虹蓄,還可以看到Json數(shù)據(jù)中的招聘信息總數(shù)1414犀呼,以及每頁顯示的招聘信息為15個。目前拉勾網(wǎng)默認(rèn)只有30頁信息薇组。


image.png

代碼為:

import requests
url = "https://www.lagou.com/jobs/positionAjax.json"
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3294.6 Safari/537.36',
           'Cookie':'XXXX',
           'Connection':'keep-alive',
           'Host':'www.lagou.com',
           'Origin':'https://www.lagou.com',
           'Referer':'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
           }
params = {'first':'true',
'pn':'1',
'kd':'python'
}
r = requests.post(url,data=params,headers=headers)
print(r.status_code)

import json
json_data = json.loads(r.text)
print(json.dumps(json_data, indent=4, sort_keys=False, ensure_ascii=False))   ##結(jié)構(gòu)化json數(shù)據(jù)

結(jié)果為:


image.png

image.png

通過觀察json結(jié)構(gòu)外臂,可以很簡單地獲取相關(guān)信息:

import json
json_data = json.loads(r.text)
# ok = json_data['success']  ##測試是否獲取了正確的json數(shù)據(jù)。若正確律胀,返回True
# print(ok)
totalcount = json_data['content']['positionResult']['totalCount']  #獲取招聘總數(shù)量
totalpage = int(totalcount/15)                                     #獲取總頁數(shù)

pagenum = totalpage if totalpage<30 else 30  #通過計算得到需要獲取的頁數(shù)宋光,用于改變pn值。
print(totalpage,pagenum)

results = json_data['content']['positionResult']['result']
for result in results:
    companyId = result['companyId']
    position_name = result['positionName']
    workyear = result['workYear']
    jobNature = result['jobNature']
    financeStage = result['financeStage']
    industryField = result['industryField']
    city = result['city']
    salary = result['salary']
    positionId = result['positionId']
    positionAdvantage = result['positionAdvantage']
    companyShortName = result['companyShortName']
    district = result['district']
    createTime = result['createTime']
    companyFullName= result['companyFullName']
    print(companyFullName,companyShortName,companyId,position_name,salary)

結(jié)果為:


image.png

多頁面炭菌,存放進(jìn)MongoDB的代碼:

import requests
import json
import pymongo
import time

client = pymongo.MongoClient('localhost',27017)
mydb = client['mydb']
lagouzhaopin_info = mydb['lagouzhaopin_info']


headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3294.6 Safari/537.36',
           'Cookie':'xxxx',
           'Connection':'keep-alive',
           'Host':'www.lagou.com',
           'Origin':'https://www.lagou.com',
           'Referer':'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
           }

def get_page(url):
    params = {'first':'true','pn':'1','kd':'python'}
    r = requests.post(url,data=params,headers=headers)
    json_data = json.loads(r.text)
    totalcount = json_data['content']['positionResult']['totalCount']  #獲取招聘總數(shù)量
    totalpage = int(totalcount/15)                                     #獲取總頁數(shù)
    pagenum = totalpage if totalpage<30 else 30  #通過計算得到需要獲取的頁數(shù)罪佳,用于改變pn值。
    return pagenum

def get_info(url,params):
    r = requests.post(url,data=params,headers=headers)
    json_data = json.loads(r.text)
    results = json_data['content']['positionResult']['result']
    for result in results:
        companyFullName= result['companyFullName']
        companyShortName = result['companyShortName']
        city = result['city']
        district = result['district']
        
        position_name = result['positionName']
        workyear = result['workYear']
        jobNature = result['jobNature']
        industryField = result['industryField']
        salary = result['salary']
        positionAdvantage = result['positionAdvantage']
        info = {'公司全名':companyFullName,
                '公司簡稱':companyShortName,
                '城市':city,
                '地區(qū)':district,
                '職位':position_name,
                '工作年限':workyear,
                '職業(yè)性質(zhì)':jobNature,
                '職業(yè)分類':industryField,
                '工資':salary,
                '公司優(yōu)勢':positionAdvantage
                       }
        lagouzhaopin_info.insert_one(info)        
        #print(companyFullName,companyShortName,city,district,position_name,workyear,jobNature,industryField,salary,positionAdvantage)
    
if __name__ == '__main__':
    url = "https://www.lagou.com/jobs/positionAjax.json"
    pagenum = get_page(url)
    for pn in range(1,pagenum+1):
        params = {'first':'true','pn':str(pn),'kd':'python'}
        get_info(url,params)
        time.sleep(2)   #記得設(shè)置睡眠時間娃兽,否則運行可能會報錯菇民。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市投储,隨后出現(xiàn)的幾起案子第练,更是在濱河造成了極大的恐慌,老刑警劉巖玛荞,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娇掏,死亡現(xiàn)場離奇詭異,居然都是意外死亡勋眯,警方通過查閱死者的電腦和手機(jī)婴梧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來客蹋,“玉大人塞蹭,你說我怎么就攤上這事⊙扰鳎” “怎么了番电?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辆琅。 經(jīng)常有香客問我漱办,道長,這世上最難降的妖魔是什么婉烟? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任娩井,我火速辦了婚禮,結(jié)果婚禮上似袁,老公的妹妹穿的比我還像新娘洞辣。我一直安慰自己咐刨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布屋彪。 她就那樣靜靜地躺著所宰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畜挥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天婴谱,我揣著相機(jī)與錄音蟹但,去河邊找鬼。 笑死谭羔,一個胖子當(dāng)著我的面吹牛华糖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘟裸,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼客叉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了话告?” 一聲冷哼從身側(cè)響起兼搏,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沙郭,沒想到半個月后佛呻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡病线,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年吓著,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片送挑。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡绑莺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惕耕,到底是詐尸還是另有隱情纺裁,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布赡突,位于F島的核電站对扶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惭缰。R本人自食惡果不足惜浪南,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漱受。 院中可真熱鬧络凿,春花似錦骡送、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怨愤,卻和暖如春派敷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撰洗。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工篮愉, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人差导。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓试躏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親设褐。 傳聞我的和親對象是個殘疾皇子颠蕴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容