簡單好用的Boss崗位搜索庫(附github鏈接)

  • 2019 年 11 月 20 日
  • 筆記

昨天一個朋友說最近想換工作。想讓我幫看下Boss現在的招聘情況如何。正好想到上個月寫了個開源爬蟲框架kcrawler,最後添加了一個Boss類支持,可以實現快速根據關鍵詞查詢不同崗位,不同行業的的招聘情況。有現成可用的庫,幫助朋友也是舉手之勞。

1. 安裝

kcrawler是開源的。開發同學可以選擇clone源碼。但是如果想省事,就直接pip install,然後導入項目使用即可。

pip install kcrawler

2. 使用

提供兩個類。

  • Crawler: 簡單配置爬取任意網站
  • Boss: Boss專用(本文推薦)

2.1 爬蟲基類 Crawler

kcrawler 提供了一個爬蟲基類 Crawler , 它封裝了一個通用型爬蟲的基礎功能。通過傳入配置字典來實例化一個網站的crawler對象,然後調用對象的crawl方法,即可實現指定目標數據的爬取。支持html,json,圖像的爬取。以下為Boss的配置示例。

from kcrawler.core.Crawler import Crawler    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鍵值。例如:

在瀏覽器里整個複製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字符串。

完成以上步驟,即可調用crawler.crawl(target)方法爬取數據了。其中target是配置字典configtargets定義的鍵。

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