事情的起源是這樣的,某個風和日麗的下午... 習慣性的打開知乎準備劃下水,看到一個問題恰好邀請回答 html
因而就萌生了採集下某招聘網站Python崗位招聘的信息,看一下目前的薪水和崗位分佈,說幹就幹。python
先說下數據採集過程當中遇到的問題,首先請求頭是必定要假裝的,不然第一步就會給你彈出你的請求太頻繁,請稍後再試,其次網站具備多重反爬策略,解決方案是每次先獲取session而後更新咱們的session進行抓取,最後拿到了想要的數據。git
Chrome瀏覽器右鍵檢查查看network,找到連接https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false
github
{"status":false,"msg":"您操做太頻繁,請稍後再訪問","clientIp":"124.77.161.207","state":2402}
,機智的我察覺到事情並無那麼簡單
真正的較量纔剛剛開始,咱們先來分析下請求的報文,面試
能夠看到請求是以post
的方式傳遞的,同時傳遞了參數json
datas = {
'first': 'false',
'pn': x,
'kd': 'python',
}
複製代碼
同時不難發現每次點擊下一頁都會同時發送一條get
請求 瀏覽器
get
請求和咱們
post
請求是一致的,那麼問題就簡單許多,整理一下思路
關鍵詞:python
**搜索範圍:**全國 **數據時效:**2019.05.05bash
#!/usr/bin/env python3.4
# encoding: utf-8
""" Created on 19-5-05 @title: '' @author: Xusl """
import json
import requests
import xlwt
import time
# 獲取存儲職位信息的json對象,遍歷得到公司名、福利待遇、工做地點、學歷要求、工做類型、發佈時間、職位名稱、薪資、工做年限
def get_json(url, datas):
my_headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36",
"Referer": "https://www.lagou.com/jobs/list_Python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=",
"Content-Type": "application/x-www-form-urlencoded;charset = UTF-8"
}
time.sleep(5)
ses = requests.session() # 獲取session
ses.headers.update(my_headers) # 更新
ses.get("https://www.lagou.com/jobs/list_python?city=%E5%85%A8%E5%9B%BD&cl=false&fromSearch=true&labelWords=&suginput=")
content = ses.post(url=url, data=datas)
result = content.json()
info = result['content']['positionResult']['result']
info_list = []
for job in info:
information = []
information.append(job['positionId']) # 崗位對應ID
information.append(job['city']) # 崗位對應城市
information.append(job['companyFullName']) # 公司全名
information.append(job['companyLabelList']) # 福利待遇
information.append(job['district']) # 工做地點
information.append(job['education']) # 學歷要求
information.append(job['firstType']) # 工做類型
information.append(job['formatCreateTime']) # 發佈時間
information.append(job['positionName']) # 職位名稱
information.append(job['salary']) # 薪資
information.append(job['workYear']) # 工做年限
info_list.append(information)
# 將列表對象進行json格式的編碼轉換,其中indent參數設置縮進值爲2
# print(json.dumps(info_list, ensure_ascii=False, indent=2))
# print(info_list)
return info_list
def main():
page = int(input('請輸入你要抓取的頁碼總數:'))
# kd = input('請輸入你要抓取的職位關鍵字:')
# city = input('請輸入你要抓取的城市:')
info_result = []
title = ['崗位id', '城市', '公司全名', '福利待遇', '工做地點', '學歷要求', '工做類型', '發佈時間', '職位名稱', '薪資', '工做年限']
info_result.append(title)
for x in range(1, page+1):
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
datas = {
'first': 'false',
'pn': x,
'kd': 'python',
}
try:
info = get_json(url, datas)
info_result = info_result + info
print("第%s頁正常採集" % x)
except Exception as msg:
print("第%s頁出現問題" % x)
# 建立workbook,即excel
workbook = xlwt.Workbook(encoding='utf-8')
# 建立表,第二參數用於確認同一個cell單元是否能夠重設值
worksheet = workbook.add_sheet('lagouzp', cell_overwrite_ok=True)
for i, row in enumerate(info_result):
# print(row)
for j, col in enumerate(row):
# print(col)
worksheet.write(i, j, col)
workbook.save('lagouzp.xls')
if __name__ == '__main__':
main()
複製代碼
固然存儲於excel固然是不夠的,以前一直用matplotlib
作數據可視化,此次換個新東西pyecharts
。session
pyecharts是一款將python與echarts結合的強大的數據可視化工具,包含多種圖表app
用戶自定義
另外須要注意的是從版本0.3.2 開始,爲了縮減項目自己的體積以及維持 pyecharts 項目的輕量化運行,pyecharts 將再也不自帶地圖 js 文件。如用戶須要用到地圖圖表(Geo、Map),可自行安裝對應的地圖文件包。
- 全球國家地圖: echarts-countries-pypkg (1.9MB): 世界地圖和 213 個國家,包括中國地圖
- 中國省級地圖: echarts-china-provinces-pypkg (730KB):23 個省,5 個自治區
- 中國市級地圖: echarts-china-cities-pypkg (3.8MB):370 箇中國城市
也可使用命令進行安裝
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
複製代碼
from pyecharts import Bar
city_nms_top10 = ['北京', '上海', '深圳', '成都', '杭州', '廣州', '武漢', '南京', '蘇州', '鄭州', '天津', '西安', '東莞', '珠海', '合肥', '廈門', '寧波',
'南寧', '重慶', '佛山', '大連', '哈爾濱', '長沙', '福州', '中山']
city_nums_top10 = [149, 95, 77, 22, 17, 17, 16, 13, 7, 5, 4, 4, 3, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1]
bar = Bar("Python崗位", "各城市數量")
bar.add("數量", city_nms, city_nums, is_more_utils=True)
# bar.print_echarts_options() # 該行只爲了打印配置項,方便調試時使用
bar.render('Python崗位各城市數量.html') # 生成本地 HTML 文件
複製代碼
from pyecharts import Geo
city_datas = [('北京', 149), ('上海', 95), ('深圳', 77), ('成都', 22), ('杭州', 17), ('廣州', 17), ('武漢', 16), ('南京', 13), ('蘇州', 7),
('鄭州', 5), ('天津', 4), ('西安', 4), ('東莞', 3), ('珠海', 2), ('合肥', 2), ('廈門', 2), ('寧波', 1), ('南寧', 1), ('重慶', 1),
('佛山', 1), ('大連', 1), ('哈爾濱', 1), ('長沙', 1), ('福州', 1), ('中山', 1)]
geo = Geo("Python崗位城市分佈地圖", "數據來源拉勾", title_color="#fff",
title_pos="center", width=1200,
height=600, background_color='#404a59')
attr, value = geo.cast(city_datas)
geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff",
symbol_size=15, is_visualmap=True)
geo.render("Python崗位城市分佈地圖_scatter.html")
geo = Geo("Python崗位城市分佈地圖", "數據來源拉勾", title_color="#fff",
title_pos="center", width=1200,
height=600, background_color='#404a59')
attr, value = geo.cast(city_datas)
geo.add("", attr, value, type="heatmap", visual_range=[0, 10], visual_text_color="#fff",
symbol_size=15, is_visualmap=True)
geo.render("Python崗位城市分佈地圖_heatmap.html")
複製代碼
from pyecharts import Pie
city_nms_top10 = ['北京', '上海', '深圳', '成都', '廣州', '杭州', '武漢', '南京', '蘇州', '鄭州']
city_nums_top10 = [149, 95, 77, 22, 17, 17, 16, 13, 7, 5]
pie = Pie()
pie.add("", city_nms_top10, city_nums_top10, is_label_show=True)
# pie.show_config()
pie.render('Python崗位各城市分佈餅圖.html')
複製代碼
因而可知,python的崗位薪資多數在10k~20k,想從事Python行業的能夠把工做年限和薪資結合起來參考一下。
從工做年限來看,1-3年或者3-5年工做經驗的招聘比較多,而應屆生和一年如下的寥寥無幾,對實習生實在不太友好,學歷也廣泛要求本科,多數公司都很重視入職人員學歷這點毋容置疑,雖然學歷不表明一切,可是對於一個企業來講,想要短期內判斷一我的的能力,最快速有效的方法無疑是從學歷入手。學歷第一關,面試第二關。
可是,這不表明學歷不高的人就沒有好的出路,如今的大學生愈來愈多,找工做也愈來愈難,競爭愈來愈激烈,即便具有高學歷,也不能保證你必定能夠找到滿意的工做,天道酬勤,特別是it這個行業,知識的迭代,比其餘行業來的更頻密。不斷學習,拓展本身學習的廣度和深度,纔是最正確的決定。
就業寒冬來臨,咱們須要的是理性客觀的看待,而不是盲目地悲觀或樂觀。從以上數據分析,若是愛好Python,仍舊能夠入坑,不過要注意一個標籤有工做經驗,就算沒有工做經驗,本身在學習Python的過程當中必定要嘗試獨立去作一個完整的項目,爬蟲也好,數據分析也好,亦或者是開發,都要嘗試獨立去作一套系統,在這個過程當中培養本身思考和解決問題的能力。持續不斷的學習,纔是對本身將來最好的投資,也是度過寒冬最正確的姿式。
招聘數據獲取可在公衆號:Python攻城獅 後臺回覆 招聘數據 便可。