程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python Selenium 字節校招實習崗篩選

編輯:Python

最近常想,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&current=1&limit=10

  • keywords:搜索框的文本
  • location:工作城市,簡短的代碼
  • category:職位類型,非常長的代碼
  • type:3 代表實習生崗位
  • current:當前頁的編號(可不設置)
  • limit:每一頁顯示的崗位數,為了讓篩選後的所有崗位都在第一頁,直接設為 10000

解析新的網址中的鍵值對,並修改代碼中 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測試開發實習生(可轉正)-國際化直播(深圳/北京) - 加入字節跳動抖音圖形圖像算法實習生(可轉正) - 加入字節跳動後台開發實習生- 存儲(有轉正機會) - 加入字節跳動後台開發實習生 - 基礎架構 — 有轉正機會 - 加入字節跳動後端開發實習生-抖音/火山/國際化視頻(有轉正機會) - 加入字節跳動後台開發實習生 — 廣告系統(可轉正) - 加入字節跳動推薦算法實習生-抖音(有轉正機會) - 加入字節跳動算法實習生—風控方向 — 有轉正機會 - 加入字節跳動測試開發實習生-廣告系統(可轉正) - 加入字節跳動
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved