1. 程式人生 > 程式設計 >簡單好用的Boss崗位爬蟲庫(附github連結)

簡單好用的Boss崗位爬蟲庫(附github連結)

昨天一個朋友說最近想換工作。想讓我幫看下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'
,'industry': { 'url': 'https://www.zhipin.com/wapi/zpCommon/data/oldindustry.json','conditions': { 'url': 'https://www.zhipin.com/wapi/zpgeek/recommend/conditions.json','job': { 'url': 'https://www.zhipin.com/wapi/zpgeek/recommend/job/list.json','queryjob': { 'url': 'https://www.zhipin.com/job_detail/','type': 'html' },'queryjobpage': { 'url': queryjobpage_url,'jobcard': { 'url': 'https://www.zhipin.com/wapi/zpgeek/view/job/card.json','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,'pinyin': 'beijing','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'}]
複製程式碼

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': '移動網際網路',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='騰訊',position=101301,page=2)
複製程式碼

返回:

[{'jobName': '天衍實驗室-大資料及人工智慧高階研究員','salaryDesc': '30-60K','3-5年','碩士'],'id': 'ce6f957a5e4cb3100nZ43dm6ElU~','lid': '22Uetj173Sz.search.1'},{'jobName': 'QQ資訊流推薦演演算法工程師/研究員','salaryDesc': '20-40K·14薪','id': 'a280e0b17a2aeded03Fz3dq_GFQ~','lid': '22Uetj173Sz.search.2'},...
複製程式碼

github

github.com/kenblikylee…


本文首發公號