最近常想,Python 可以到哪些崗位就職?
於是我便瞄到了字節跳動的校招網站 https://jobs.bytedance.com/campus/position?,想用 requests 模塊來爬取 Python 相關的崗位
但眾所周知,get 請求爬到網頁源代碼不是難事,難的地方在找到目標數據對應的 post 請求
為了避開這“蛋疼”的一環,直接在浏覽器操作得了 —— 於是 selenium 它來了
與 requests 不同,selenium 只需要輸入一個 get 請求就完事了首先編輯目標的 url 的參數:
https://jobs.bytedance.com/campus/position?keywords=轉正&location=CT_128%2CCT_45&type=3¤t=1&limit=10
解析新的網址中的鍵值對,並修改代碼中 params 字典的 keywords、location、category、type,使用 for 循環即可拼接得到最終的 url
import pandas as pd
from selenium.webdriver import Edge
from tqdm import tqdm
url = f'https://jobs.bytedance.com/campus/position?'
params = {
'keywords': '轉正', # 搜索關鍵詞
'location': 'CT_45%2CCT_128', # 工作城市: 廣州, 深圳
'category': '6704215862603155720%2C6704215862557018372%2C6704215956018694411%2C6704215886108035339%2C6704215957146962184%2C6704215897130666254%2C6704215958816295181%2C6704215888985327886%2C6704215963966900491%2C6704216109274368264%2C6704217321877014787%2C6704219452277262596%2C6704216635923761412%2C6704219534724696331%2C6704216296701036811%2C6938376045242353957',
# 職位類型: 研發
'type': 3, # 招聘類型: 實習生
'limit': 10000 # 頁面職位顯示
}
for key in params:
url += f'{key}={params[key]}&'
與 requests 不同的是,selenium 不需要 post 請求,但是需要等待網頁加載,所以需要一個 while 循環來等待網頁加載完,再使用 xpath 進行結點的定位
def xpath(root, value, verbose=False):
''' selenium 結點元素定位
root: 根結點
value: xpath 表達式
verbose: 輸出調試信息'''
while 1:
try:
result = root.find_elements('xpath', value)
if result:
return result if len(result) != 1 else result[0]
except:
if verbose: print('\r未找到相應元素...', end='')
通過網頁檢查,找到對應崗位鏈接的位置,拷貝 xpath 再修改一波,就可以得到該頁面所有崗位的鏈接
故技重施,再找到崗位連接中“職位要求”的位置(還可以找標題的位置),就可以寫出主函數了
def byte_dance(keywords=[], stopwords=[]):
''' keywords: 關鍵詞序列
stopwords: 停用詞序列'''
web = Edge()
web.get(url)
# 找到各個崗位的鏈接
links = xpath(web, '//*[@id="bd"]/section/section/main/div/div/div[2]/div[3]/div[1]/div[2]/a', verbose=True)
links = list(map(lambda link: link.get_attribute('href'), links))
# 篩選校招信息
desired = []
for link in tqdm(links):
web.get(link)
box = xpath(web, '//*[@id="bd"]/section/section/main/div/div/div[1]')
# 讀取職位名稱、職位要求
title = xpath(box, 'div[1]/span').text
require = xpath(box, 'div[6]').text
# 檢查關鍵詞是否不在職位要求中
fail = list(filter(lambda kwd: kwd not in require, keywords)) + \
list(filter(lambda swd: swd in require, stopwords))
if not fail: desired.append({'link': link, 'title': title, 'require': require})
web.quit()
return pd.DataFrame(desired)
最後使用 pandas 的 ExcelWriter 把篩選後的數據寫入 Excel
def excel_dump(dataframe, file, sheet_name='tzj', float_format='%.4f'):
writer = pd.ExcelWriter(file)
dataframe.to_excel(writer, sheet_name=sheet_name, float_format=float_format)
writer.save()
desired = byte_dance(keywords=['Python'], stopwords=[])
print(desired)
excel_dump(desired, '字節校招.xlsx')
所有“職位要求”中出現“Python”的崗位有:
link測試開發實習生(可轉正)-國際化直播(深圳/北京) - 加入字節跳動抖音圖形圖像算法實習生(可轉正) - 加入字節跳動後台開發實習生- 存儲(有轉正機會) - 加入字節跳動後台開發實習生 - 基礎架構 — 有轉正機會 - 加入字節跳動後端開發實習生-抖音/火山/國際化視頻(有轉正機會) - 加入字節跳動後台開發實習生 — 廣告系統(可轉正) - 加入字節跳動推薦算法實習生-抖音(有轉正機會) - 加入字節跳動算法實習生—風控方向 — 有轉正機會 - 加入字節跳動測試開發實習生-廣告系統(可轉正) - 加入字節跳動