手把手帶你抓取智聯招聘的“資料分析師”崗位!
前言
很多網友在後臺跟我留言,是否可以分享一些爬蟲相關的文章,我便提供了我以前寫過的爬蟲文章的連結(如下連結所示),大家如果感興趣的話也可以去看一看哦。在本文中,我將以智聯招聘為例,分享一下如何抓取近5000條的資料分析崗資訊。
往期爬蟲連結
ofollow,noindex" target="_blank">上海歷史天氣和空氣質量資料獲取(Python版) 網路爬蟲-京東優惠活動資料分析 快來看看招商銀行理財產品資料(程式碼及分析) 用Python爬下6萬共享單車資料,談談單車熱潮中的城市 百度指數之影象數字識別(2) 抓取百度指數引發的影象數字識別 一件有趣的事: 爬了爬自己的微信朋友 看看融資界都有哪些事情發生 【乾貨】手把手帶你抓“網上購物”類APP資訊(含程式碼) 快來圍觀2W+的豆瓣電影分類排行榜(含程式碼) 什麼?你瞭解二手車市場?(含爬蟲程式碼) (乾貨)資料分析案例--以上海二手房為例 通過Python抓取天貓評論資料 使用Python實現豆瓣閱讀書籍資訊的獲取 使用Python爬取網頁圖片
爬蟲流程
首先簡單聊一下Python抓取網際網路資料的一般步驟,如下圖所示: 1) 傳送請求 ,向對方伺服器傳送待抓取網站的連結URL; 2) 返回請求 ,在不發生意外的情況下(意外包括網路問題、客戶端問題、伺服器問題等),對方伺服器將會返回請求的內容(即網頁原始碼) 3) 資料儲存 ,利用正則表示式或解析法對原始碼作清洗,並將目標資料儲存到本地(txt、csv、Excel等)或資料庫(SQL/">MySQL、SQL Server、MongoDB等)
爬蟲實操
接下來,在理解了爬蟲流程之後,我們藉助於智聯招聘的網站,跟大家分析如何一步一步的完成資料的抓取。
尋找目標URL
如下圖所示,是在智聯招聘網站上搜索“資料分析師”崗位後的響應結果。按照常理,需要按一下鍵盤中的F12鍵,對網頁內容進行監控。
接著,在原網頁中下來滾動條,並點選“下一頁”,此時右側的監控臺便發生了變化,讀者需要按下圖進行選擇:
經過這四步的選擇,就可以發現招聘網站上的資訊都在這個Preview(預覽)裡面。那麼問題來了,需要抓取的URL是什麼呢?此時只需點選Headers卡即可,你會發現請求連結就是下圖中框出來的部分:
傳送請求並返回請求內容
既然找到了目標URL,下面要做的就是基於Python向智聯招聘的伺服器傳送請求了,具體程式碼如下:
import requests# 用於傳送URL請求 import pandas as pd # 用於構造資料框 import random# 用於產生隨機數 import time# 用於時間停留# 根據第一頁的URL,抓取“資料分析師”崗位的資訊 url = r'https://fe-api.zhaopin.com/c/i/sou?pageSize=60&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3&lastUrlQuery=%7B%22jl%22:%22489%22,%22kw%22:%22%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88%22,%22kt%22:%223%22%7D&at=9c5682b1a4f54de89c899fb7efc7e359&rt=54eaf1be1b8845c089439d53365ea5dd&_v=0.84300214&x-zp-page-request-id=280f6d80d733447fbebafab7b8158873-1541403039080-617179' # 構造請求的頭資訊,防止反爬蟲 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'} # 利用requests包中的get函式傳送請求 response = requests.get(url, headers = headers) # 基於response返回Json資料 datas = response.json()
如上結果所示,即為抓取回來的招聘資訊,這些資訊是以字典的形式儲存起來的。需要說明的是,在傳送請求的程式碼中,添加了請求頭資訊,其目的就是防止對方伺服器禁止Python爬蟲。關於頭資訊可以在Headers選項中的“Request Headers”部分找到,讀者只需將“User-Agent”值摘抄下來即可。
內容解析(Json)
下面利用字典的鍵索引知識,將所需欄位的值解析出來。這裡不妨以公司名稱為例,利用字典的索引技術將其取出來。具體如下圖所示:
OK,按照如上的策略,便可以取出其他欄位的資訊,具體程式碼如下:
# 根據Json資料返回每一條招聘資訊# 返回公司名稱 company = [i['company']['name'] for i in response.json()['data']['results']] # 返回公司規模 size = [i['company']['size']['name'] for i in response.json()['data']['results']] # 返回公司型別 type = [i['company']['type']['name'] for i in response.json()['data']['results']] # 返回公司招聘資訊 positionURL = [i['positionURL'] for i in response.json()['data']['results']] # 返回工作經驗的要求 workingExp = [i['workingExp']['name'] for i in response.json()['data']['results']] # 返回教育水平的要求 eduLevel = [i['eduLevel']['name'] for i in response.json()['data']['results']] # 返回薪資水平 salary = [i['salary'] for i in response.json()['data']['results']] # 返回工作崗位名稱 jobName = [i['jobName'] for i in response.json()['data']['results']] # 返回福利資訊 welfare = [i['welfare'] for i in response.json()['data']['results']] # 返回崗位所在城市 city = [i['city']['items'][0]['name'] for i in response.json()['data']['results']] # 返回經度 lat = [i['geo']['lat'] for i in response.json()['data']['results']] # 返回緯度 lon = [i['geo']['lon'] for i in response.json()['data']['results']] # 將返回的資訊構造表格 pd.DataFrame({'company':company,'size':size,'type':type,'positionURL':positionURL, 'workingExp':workingExp,'eduLevel':eduLevel,'salary':salary, 'jobName':jobName,'welfare':welfare,'city':city,'lat':lat,'lon':lon})
資料儲存
如上操作只是將招聘網站中的第一頁內容抓取下來,如果需要抓取n多頁,就需要藉助於for迴圈的技術。但在迴圈之前,需要準確找到目標連結的規律,然後使用for迴圈就水到渠成了。所以,我們按照之前的方法,找到第二頁、第三頁、第四頁連結,然後發現其中的規律,如下圖所示: 如上圖所示,在連結中只有一部分內容發生變化,即“start=”,而其他部分都保持不變。所以,按照這個規律就可以對多頁內容進行抓取,程式碼如下:
# 構造空列表,用於儲存各頁的招聘資訊 jobs = [] # 利用for迴圈,生成規律的連結,並對這些連結進行請求的傳送和解析內容 for i in range(0,6001,60): url = 'https://fe-api.zhaopin.com/c/i/sou?start='+str(i)+'&pageSize=60&cityId=489&workExperience=-1&education=-1&companyType=-1&employmentType=-1&jobWelfareTag=-1&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3&lastUrlQuery=%7B%22p%22:5,%22jl%22:%22489%22,%22kw%22:%22%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88%22,%22kt%22:%223%22%7D&at=17a95e7000264c3898168b11c8f17193&rt=57a342d946134b66a264e18fc60a17c6&_v=0.02365098&x-zp-page-request-id=a3f1b317599f46338d56e5d080a05223-1541300804515-144155' response = requests.get(url, headers = headers) print('Down Loading:','https://fe-api.zhaopin.com/c/i/sou?start='+str(i)+'&pageSize=60','......') company = [i['company']['name'] for i in response.json()['data']['results']] size = [i['company']['size']['name'] for i in response.json()['data']['results']] type = [i['company']['type']['name'] for i in response.json()['data']['results']] positionURL = [i['positionURL'] for i in response.json()['data']['results']] workingExp = [i['workingExp']['name'] for i in response.json()['data']['results']] eduLevel = [i['eduLevel']['name'] for i in response.json()['data']['results']] salary = [i['salary'] for i in response.json()['data']['results']] jobName = [i['jobName'] for i in response.json()['data']['results']] welfare = [i['welfare'] for i in response.json()['data']['results']] city = [i['city']['items'][0]['name'] for i in response.json()['data']['results']] lat = [i['geo']['lat'] for i in response.json()['data']['results']] lon = [i['geo']['lon'] for i in response.json()['data']['results']] # 隨機生成5~8之間的實數,用於頁面的停留時長(仍然是防止反爬蟲) seconds = random.randint(5,8) time.sleep(seconds) # 將每一頁的內容儲存到jobs列表中 jobs.append(pd.DataFrame({'company':company,'size':size,'type':type,'positionURL':positionURL, 'workingExp':workingExp,'eduLevel':eduLevel,'salary':salary, 'jobName':jobName,'welfare':welfare,'city':city,'lat':lat,'lon':lon})) # 拼接所有頁碼下的招聘資訊 jobs2 = pd.concat(jobs) # 將資料匯出到Excel檔案中 jobs2.to_excel('jobs.xlsx', index = False)
如上結果所示,即為資料匯出後的Excel效果圖。在下一期,我將針對抓取回來的資料,進行內容的分析。
結語
OK,關於使用Python完成招聘網站資料的抓取就分享到這裡,如果你有任何問題,歡迎在公眾號的留言區域表達你的疑問。同時,也歡迎各位朋友繼續轉發與分享文中的內容,讓更多的人學習和進步。 關於Python的其他知識(包括資料的清洗、整理、運算、分析、視覺化和建模),讀者可以查閱我的新書《從零開始學Python資料分析與挖掘》,如果您對書中的內容有任何疑問,都可以聯絡我。 本文中的程式碼和資料可以從百度雲盤中下載,只需關注“資料分析1480”公眾號,並回復“智聯招聘”即可。
資料人網是資料人學習,交流和分享的平臺,誠邀您創造和分享資料知識,共建和共享資料智庫。