昨天一個朋友說最近想換工做。想讓我幫看下Boss如今的招聘狀況如何。正好想到上個月寫了個開源爬蟲框架kcrawler
,最後添加了一個Boss
類支持,能夠實現快速根據關鍵詞查詢不一樣崗位,不一樣行業的的招聘狀況。有現成可用的庫,幫助朋友也是舉手之勞。html
1. 安裝
kcrawler
是開源的。開發同窗能夠選擇clone
源碼。可是若是想省事,就直接pip install
,而後導入項目使用便可。python
pip install kcrawler
2. 使用
提供兩個類。git
-
Crawler: 簡單配置爬取任意網站 -
Boss: Boss專用(本文推薦)
2.1 爬蟲基類 Crawler
kcrawler
提供了一個爬蟲基類 Crawler
, 它封裝了一個通用型爬蟲的基礎功能。經過傳入配置字典來實例化一個網站的crawler
對象,而後調用對象的crawler
方法,便可實現指定目標數據的爬取。支持html,json,圖像的爬取。如下爲Boss
的配置示例。github
def queryjobpage_url(x): p = list() if x[0]: p.append('i' + str(x[0])) if x[1]: p.append('c' + str(x[1])) if x[2]: p.append('p' + str(x[2])) return 'https://www.zhipin.com/{}/'.format('-'.join(p))
config = { 'targets': { 'city': { 'url': 'https://www.zhipin.com/wapi/zpCommon/data/city.json', 'method': 'get', 'type': 'json' }, 'position': { 'url': 'https://www.zhipin.com/wapi/zpCommon/data/position.json', 'method': 'get', 'type': 'json' }, 'industry': { 'url': 'https://www.zhipin.com/wapi/zpCommon/data/oldindustry.json', 'method': 'get', 'type': 'json' }, 'conditions': { 'url': 'https://www.zhipin.com/wapi/zpgeek/recommend/conditions.json', 'method': 'get', 'type': 'json' }, 'job': { 'url': 'https://www.zhipin.com/wapi/zpgeek/recommend/job/list.json', 'method': 'get', 'type': 'json' }, 'queryjob': { 'url': 'https://www.zhipin.com/job_detail/', 'method': 'get', 'type': 'html' }, 'queryjobpage': { 'url': queryjobpage_url, 'method': 'get', 'type': 'html' }, 'jobcard': { 'url': 'https://www.zhipin.com/wapi/zpgeek/view/job/card.json', 'method': 'get', 'type': 'json' } }}
crawler = Crawler(config)
如今完成了爬蟲對象的建立。有過爬蟲經驗的同窗可能已經注意到了,怎麼沒有headers
?事實上,有兩種方法傳入headers
。一種是直接在配置字典config
增長headers
鍵值。例如:web
在瀏覽器裏整個複製Request Headers
,以文檔字符串的形式賦值給變量headers
。算法
headers = ''':authority: www.zhipin.com:method: GET:path: /....cookie: xxx....user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36'''config = {'headers': headers, 'targets': { ... }}
第二種推薦的方式是在當前目前下新建一個文件名爲headers
的文件。以一樣的方法在瀏覽器複製整個headers
字符串覆蓋這個文件,直接覆蓋,不用加文檔字符變量。當config
字典沒有提供headers
字段時,Crawler
會自動從headers
文件讀取headers
字符串。json
完成以上步驟,便可調用crawler.crawl(target)
方法爬取數據了。其中target
是配置字典config
中targets
定義的鍵。api
data = crawler.crawl('job')
2.2 Boss 類
使用Crawler
爬取的數據是網站的原始數據的,雖然已經轉換成字典或者列表,可是要進一步獲得感興趣的字段,還須要本身提取。可是kcrawler
已經提供了一個Boss
類能夠直接使用。瀏覽器
固然仍是建議你先按照前文的方法先在瀏覽器中複製Request Headers
,保存到當前目錄下的headers
文件中。而後就能夠愉快地使用Boss
類實例化一個對象,爬取感興趣的數據。微信
from kcrawler import Boss
boss = Boss()
看到以下輸出,表示成功讀取到headers
文件的內容。
read heades from file.parse headers
2.2.1 招聘城市
cities = boss.city()
返回:
[{'id': 101010000, 'name': '北京', 'pinyin': None, 'firstChar': 'b', 'rank': 1, 'children': [{'id': 101010100, 'name': '北京', 'pinyin': 'beijing', 'firstChar': 'b', 'rank': 1}]}, {'id': 101020000, 'name': '上海',...]
2.2.2 熱門城市
hotcities = boss.hotcity()
返回:
[{'id': 100010000, 'name': '全國'}, {'id': 101010100, 'name': '北京'}, {'id': 101020100, 'name': '上海'}, {'id': 101280100, 'name': '廣州'}, {'id': 101280600, 'name': '深圳'}, {'id': 101210100, 'name': '杭州'},...]
2.2.3 當前登錄用戶所在城市
user_city = boss.userCity()
返回:
嘿嘿,就不告訴你。。。
2.2.4 行業
industries = boss.industry()
返回:
[{'id': 100001, 'name': '電子商務'}, {'id': 100002, 'name': '遊戲'}, {'id': 100003, 'name': '媒體'}, {'id': 100004, 'name': '廣告營銷'}, {'id': 100005, 'name': '數據服務'}, {'id': 100006, 'name': '醫療健康'}, {'id': 100007, 'name': '生活服務'}, {'id': 100008, 'name': 'O2O'}, {'id': 100009, 'name': '旅遊'}, {'id': 100010, 'name': '分類信息'}, {'id': 100011, 'name': '音樂/視頻/閱讀'}, {'id': 100012, 'name': '在線教育'}, {'id': 100013, 'name': '社交網絡'},...]
2.2.5 當前登錄用戶指望崗位(三個)
expects = boss.expect()
返回:
[{'id': xxx, 'positionName': 'xxx'}, {'id': xxx, 'positionName': 'xxx'}, {'id': xxx, 'positionName': 'xxx'}]
2.4.6 給當前登錄用戶推薦的崗位列表
boss.job(i, page)
方法須要提供兩個參數,第一個是boss.expect()
返回列表的索引,例如0表明第一個指望崗位的推薦崗位;第二個參數page
用於指定數據分頁,例如1是第一頁。
jobs = boss.job(0, 1)
返回:
[{'id': 'be8bfdcdf7e99df90XV-0t-8FVo~', 'jobName': '深度學習平臺經理/技術中級', 'salaryDesc': '30-50K', 'jobLabels': ['深圳 福田區 購物公園', '5-10年', '本科'], 'brandName': '中國平安', 'brandIndustry': '互聯網金融', 'lid': '411f6b88-8a83-437a-aa5f-5de0fc4da2b7.190-GroupC,194-GroupB.1'}, {'id': 'f649c225a1b9038f0nZ609W5E1o~', 'jobName': '推薦系統評測工程師', 'salaryDesc': '20-35K', 'jobLabels': ['深圳 南山區 科技園', '1-3年', '本科'], 'brandName': '騰訊', 'brandIndustry': '互聯網', {'id': '94cfec046b98b9671H150tS8E1M~', 'jobName': '用戶數據挖掘工程師', 'salaryDesc': '20-40K·15薪', 'jobLabels': ['深圳 南山區 南山中心', '經驗不限', '本科'], 'brandName': '今日頭條', 'brandIndustry': '移動互聯網', 'lid': '411f6b88-8a83-437a-aa5f-5de0fc4da2b7.190-GroupC,194-GroupB.4'},...]
2.4.7 經過關鍵詞搜索崗位
city
, industry
, position
是上文已經爬取的數據對應ID字段;query
不用說就是查詢關鍵詞;這裏之因此使用兩個不一樣的方法,由於Boss
搜索崗位第一頁和第二頁及以後的頁面的URL組成結構不一樣,前者固定不變,後者是變化的。這也是爲何前文傳入配置字典的URL使用了函數形式。
所以,若是你只對查詢第一頁數據感興趣就使用queryjob
方法;若是你想繼續查看第二頁及之後的數據,就必須使用queryjobpage
方法。固然,事實上queryjobpage
的方法也能夠爬第一頁的數據,可是建議分開使用,這樣較不容易觸發反爬蟲機制。畢竟這是用戶正常訪問時行爲。
tencent_jobs1 = boss.queryjob(query='騰訊', city=101280600, industry=None, position=101301)tencent_jobs2 = boss.queryjobpage(query='騰訊', city=101280600, industry=None, position=101301, page=2)
返回:
[{'jobName': '天衍實驗室-大數據及人工智能高級研究員', 'salaryDesc': '30-60K', 'jobLabels': ['深圳 南山區 科技園', '3-5年', '碩士'], 'brandName': '騰訊', 'brandIndustry': '互聯網', 'id': 'ce6f957a5e4cb3100nZ43dm6ElU~', 'lid': '22Uetj173Sz.search.1'}, {'jobName': 'QQ信息流推薦算法工程師/研究員', 'salaryDesc': '20-40K·14薪', 'jobLabels': ['深圳 南山區 科技園', '經驗不限', '本科'], 'brandName': '騰訊', 'brandIndustry': '互聯網', 'id': 'a280e0b17a2aeded03Fz3dq_GFQ~', 'lid': '22Uetj173Sz.search.2'},...
github
https://github.com/kenblikylee/kcrawler
本文分享自微信公衆號 - 我是一條小青蛇(ws1txqs)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。