摘要:愛寫作者愛寫前言看了很多網站,只發現獲取拉勾網招聘信息是只用方式就可以得到,應當是非常簡單了。在環境下運行通過數據爬取篇偽造瀏覽器訪問拉勾網打開瀏覽器,進入拉勾網官網,右鍵檢查,調出開發者模式。
[TOC]
愛寫bug(ID:icodebugs)前言:作者:愛寫bug
? 看了很多網站,只發現獲取拉勾網招聘信息是只用post方式就可以得到,應當是非常簡單了。推薦剛接觸數據分析和爬蟲的朋友試一下。
在python3.7、acaconda3環境下運行通過
數據爬取篇: 1、偽造瀏覽器訪問拉勾網打開Chrome瀏覽器,進入拉勾網官網,右鍵->檢查,調出開發者模式。
然后在拉勾網搜索關鍵詞 算法工程師 回車,然后點擊下一頁、下一頁,此時開發者工具里的Network 下XHR(表示該網站是以Ajax方式獲取刷新信息的)應當如下圖(圖中已標明了一些關鍵信息):
每次點擊下一頁圖中XHR下以PositionAjax開頭的請求就會多一條,圖下方 Form Data 里 page numberpn 就會增加1,網站地址:https://www.lagou.com/jobs/list_ + 搜索關鍵詞 city= + 城市名稱 +&cl=false&fromSearch=true&labelWords=&suginput=
當然搜索關鍵詞是中文的話一定要 unicode 轉碼。這里我們以關鍵字為算法工程師,地區為全國 為例,所以URL:
轉碼前: https://www.lagou.com/jobs/list_算法工程師?city=全國&cl=false&fromSearch=true&labelWords=&suginput= 轉碼后: https://www.lagou.com/jobs/list_%E7%AE%97%E6%B3%95%E5%B7%A5%E7%A8%8B%E5%B8%88?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=
根據圖中 Request Headers 構造請求頭偽造成瀏覽器訪問:
headers = { "Accept": "application/json, text/javascript, */*; q=0.01", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36", "Referer": "https://www.lagou.com/jobs/list_%E7%AE%97%E6%B3%95%E5%B7%A5%E7%A8%8B%E5%B8%88?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=" }
然后根據圖中 Form Data來構造表單,只有pn表示的當前所在頁數需要不斷改變,所以 pn 定義一個變量num表示當前頁數:
form_data = { "first": "true", "pn": num, "kd": "算法工程師" }
然后試一下:
request=requests.post(url,data=form_data,headers=headers) print(request.text)
但是尷尬的是這個時候post請求獲得的回復是:
{"status":false,"msg":"您操作太頻繁,請稍后再訪問","clientIp":"182.245.65.138","state":2402}
由于該網站的反爬措施,此時無論把請求頭構造的多好都沒用,哪怕用本地的Cookie。
所以我們采用 Seesion 對話方式:
s = requests.Session() # 創建一個session對象 s.get(url_start, headers=headers, timeout=3) # 使用session維持同一個會話 cookie = s.cookies # 使用該會話的cookie response = s.post(url, data=form_data, headers=headers, cookies=cookie, timeout=3)
連接成功!
2、獲取招聘數據然后解析返回的 json 對象。我們先在開發者工具里把 PositionAjax 項的 Headers 改到 Preview 看一下Chrome幫我們格式化好的 json 內容:
出現了,我們想要的數據 在 content -> positionResult -> result , 一共從0到14共15條信息,這對應了網站每頁現實的信息數。而最下面還有 totalCount: 16945 這是搜索該關鍵詞 算法工程師 下的總條目數。可以根據這個算出一共有多頁的信息(16945 / 15)而不是網站上顯示的只有30頁。由于時間關系,本次示例只獲取29頁數據。本次示例只獲取29頁數據。
def parse_page(job_json): job_list = job_json["content"]["positionResult"]["result"] company_info = [] for job in job_list: job_info = [] job_info.append(job["companyFullName"])#公司全稱 job_info.append(job["companySize"])#規模 job_info.append(job["financeStage"])#融資情況 job_info.append(job["district"])#位置 job_info.append(job["positionName"])#職位 job_info.append(job["workYear"])#工作經驗要求 job_info.append(job["education"])#學歷 job_info.append(job["salary"])#工資 job_info.append(job["positionAdvantage"])#福利待遇 company_info.append(job_info)#把所有職位情況添加到網頁信息page_info return company_info
我們就把每個公司的各類招聘情況存儲在 company_info 里了。
最后把所有 company_info 匯總在一起:
result = parse_page(job_json) all_company += result # 所有公司招聘信息匯在一起
接著以CSV格式存儲在本地:
path = "A:Temp" # 指定csv數據存儲路徑 df.to_csv(path + "lagou_algorithm_data.csv", index=False) print("保存路徑:" + path + "lagou_algorithm_data.csv")
數據圖片:
](https://upload-images.jianshu...
? 我們獲得的數據都是以字符串形式存儲的,而且像工資(20k—30k)、工作經驗(3—5年)都是以區間的形式表現出來的,應該求其平均值(工資25k,工作經驗4年)。另外像工作經驗 不限、應屆畢業生等,我們應該把該公司要求年限 改為0。
pattern = "d+" # 正則表達式-匹配連續數字 # 統計每個公司的平均經驗要求 lagou_data["平均經驗"] = lagou_data["經驗"].str.findall( pattern) # findall查找所有["經驗"]下的數字字符串 avg_work_year = [] for i in lagou_data["平均經驗"]: if len(i) == 0: # 長度為0則意為著沒數字,既工作經驗為不限、應屆畢業生等,即沒有工作經驗要求 avg_work_year.append(0) else: # 匹配的是兩個數值的工作經驗區間 幾年到幾年,, year_list = [int(j) for j in i] # 得到每一個數轉為int型 avg_year = sum(year_list)/2 # 求工作區間的平均值,平均年限 avg_work_year.append(avg_year) lagou_data["平均經驗"] = avg_work_year # 統計每個公司給出的平均工資 lagou_data["平均工資"] = lagou_data["工資"].str.findall(pattern) avg_salary = [] for k in lagou_data["平均工資"]: salary_list = [int(n) for n in k] salary = sum(salary_list)/2 avg_salary.append(salary) lagou_data["平均工資"] = avg_salary # 新列一項平均工資
存儲的csv文件(你需要先存到本地才能看得到)會多兩列 平均經驗 和 平均工資:
2、數據可視化:由于本篇為基礎篇只畫兩個最簡單的圖且不做過多渲染美化,數據可視化都是一些簡單的繪圖,只有一個中文顯示亂碼問題,其他并沒有什么坑,所以不做過多描述。
解決中文亂碼問題:
plt.rcParams["font.sans-serif"] = ["SimHei"] # 替換sans-serif字體顯示中文 plt.rcParams["axes.unicode_minus"] = False # 解決坐標軸負數的負號顯示問題平均工資直方圖:
# 繪制工資頻率直方圖 plt.hist(lagou_data["平均工資"], alpha=0.8, color="steelblue") plt.xlabel("工資/千元") plt.ylabel("頻數") plt.title("算法工程師平均工資直方圖") plt.savefig(path+"lagou_algorithm_salary.jpg") # 指定保存路徑 plt.show()平均工作經驗要求直方圖(代碼與上面相似,省略): 學歷要求餅狀圖:
# 繪制學歷要求餅圖 count = lagou_data["學歷"].value_counts() plt.pie(count, labels=count.keys(), shadow=True,autopct="%2.2f%%") plt.savefig(path+"lagou_algorithm_education.jpg") plt.show()繪制福利待遇詞云:
這里要注意一下,上面設置的全局顯示字體僅對matplotlib,有效,所以這里要指定一下字體防止中文亂碼。
# 繪制福利待遇詞云 color_mask = imread(path+"china_map.jpg") strs = "" for line in lagou_data["福利"]: strs += line # 連接所有字符串 cut_strs = " ".join(jieba.cut(strs)) # 使用中文分詞jieba,將字符串分割成列表 word_cloud = WordCloud(font_path="C:WindowsFonts微軟雅黑msyh.ttc",mask=color_mask,background_color="white").generate(cut_strs) # 指定顯示字體避免中文亂碼 word_cloud.to_file(path+"lagou_algorithm_wordcloud.jpg") # 存儲圖片 plt.imshow(word_cloud) plt.show()
這里詞云背景指定為中國地圖:
公司福利詞云最終效果圖:
? 本文面向新手,文中不可避免有一些設置不合理的問題(數據量過少、工資取平均值代表不了實際情況),但還是可以從一定程度上反映出這個崗位的待遇和工資水平。
工資絕大部分集中在 2萬到3萬之間真的是相當高了。不過要求也不低,在多年的工作經驗要求下,依然要求碩士畢業學歷的公司依然占比 33%。相信過不了多久,本科和碩士的學歷要求占比就會換一下位置了。五(六)險一金是開的最多的福利待遇,算是公司準則了。現在公司都流行用彈性工作、氛圍什么的精神福利來招人了么。
所有源代碼及地圖素材:https://github.com/zhangzhe532/icodebugs/tree/master/DataAnalysis/lagou_data_Analysis
注:文章主要參考:
Python Data Science Handbook(Python數據科學手冊)
pandas API 文檔:https://pandas.pydata.org/pan...
可視化WordCloud: https://www.jianshu.com/p/daa...
matplotlib中文亂碼問題 :https://www.cnblogs.com/hhh54...
網站反爬機制日新月異,所以本文有較強的時效性,無法保證您在實踐時是否還可行.
所有數據、操作僅作學習交流,不會用于商業用途。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45105.html
摘要:最近在研究區塊鏈,閑來無事抓取了拉勾網上條區塊鏈相關的招聘信息。拉勾網的反爬蟲做的還是比較好的,畢竟自己也知道這種做招聘信息聚合的網站很容易被爬,而且比起妹子圖這種網站,開發的技術水平應該高不少。 最近在研究區塊鏈,閑來無事抓取了拉勾網上450條區塊鏈相關的招聘信息。過程及結果如下。 拉勾網爬取 首先是從拉勾網爬取數據,用的requests庫。拉勾網的反爬蟲做的還是比較好的,畢竟自己也...
摘要:拉勾網的爬蟲還是有一定的難度的所以我們今天就爬取試一下其實并沒有太大的難度只要我們用好分析一下請求就會其實沒有什么難度上代碼親測可用拉鉤代碼 拉勾網的爬蟲還是有一定的難度的 所以我們今天就爬取試一下 其實并沒有太大的難度 只要我們用好network 分析一下請求 就會其實沒有什么難度 上代碼 2019-05-22 親測可用 拉鉤代碼
摘要:因為本人在成都從事前端,所以這次爬取的關鍵詞既是成都,前端。僅僅有這個是不夠的,因為貌似拉勾網有反爬蟲,沒有好像得不到數據這個還待論證,至少我這邊是。 前言 showImg(https://segmentfault.com/img/bV1g4S?w=700&h=490); 今天是2018的第一天,首先祝各位小伙伴元旦快樂!又到了新的一年,雖然離春節還有一段時間,但是程序狗打工不易啊,不...
摘要:因為本人在成都從事前端,所以這次爬取的關鍵詞既是成都,前端。僅僅有這個是不夠的,因為貌似拉勾網有反爬蟲,沒有好像得不到數據這個還待論證,至少我這邊是。 前言 showImg(https://segmentfault.com/img/bV1g4S?w=700&h=490); 今天是2018的第一天,首先祝各位小伙伴元旦快樂!又到了新的一年,雖然離春節還有一段時間,但是程序狗打工不易啊,不...
摘要:前言之前斷斷續續學習了,今天就拿拉勾網練練手,順便通過數據了解了解最近的招聘行情哈方面算是萌新一個吧,希望可以和大家共同學習和進步。 前言 之前斷斷續續學習了node.js,今天就拿拉勾網練練手,順便通過數據了解了解最近的招聘行情哈!node方面算是萌新一個吧,希望可以和大家共同學習和進步。 一、概要 我們首先需要明確具體的需求: 可以通過node index 城市 職位來爬取相關信...
閱讀 693·2021-11-18 10:07
閱讀 2884·2021-09-22 16:04
閱讀 884·2021-08-16 10:50
閱讀 3345·2019-08-30 15:56
閱讀 1790·2019-08-29 13:22
閱讀 2667·2019-08-26 17:15
閱讀 1239·2019-08-26 10:57
閱讀 1110·2019-08-23 15:23