利用Python實現(xiàn)招聘平臺自動投遞功能
引言
在自動化招聘投遞的場景中,傳統(tǒng)的基于 DOM 樹的瀏覽器自動化(如 Selenium/Playwright)往往面臨極高的維護成本與嚴格反爬風控。一旦平臺更新頁面結構,腳本就會立刻失效。
與之相對的另一種解決方案是:降維打擊,采用純視覺與鍵鼠模擬的 UI 自動化。這種模式與人類肉眼看屏幕、用手點鼠標的邏輯完全一致,平臺極難從流量特征上辨別。
核心技術棧
這類框架主要只依賴幾個標準庫協(xié)同:
opencv-python:用于圖像色彩分析、輪廓提取。pyautogui/pyscreeze:提供底層的鼠標點擊、滾輪滑動以及基礎截圖找圖。pyperclip:用于繞過鍵鼠輸入的字符限制(負責中文文本和表情發(fā)送)。keyboard:系統(tǒng)級全局鍵盤鉤子,用于在發(fā)生異常時緊急中斷。
所謂的自動化其實就三步走“截圖 ? 找圖 ? 點擊”;
在這里最容易導致程序停止的就是“找圖”這個關鍵!
網(wǎng)速不穩(wěn)定的解決方案
現(xiàn)象:點擊崗位后,詳情頁有時 0.1 秒加載好,有時卡 3 秒。如果硬寫 time.sleep(3) 效率極低;寫短了會找不到按鈕而報錯崩潰。
動態(tài)輪詢與超時棄權機制(動態(tài)找圖點擊)。 不使用固定等待,通過高頻捕捉屏幕元素,一旦出現(xiàn)馬上動作,到了時限依然沒有就靜默跳過。
import time
import pyautogui
def click_with_timeout(img_path, confidence=0.8, timeout=3.0):
start_time = time.time()
# 在 timeout 秒內(nèi)不斷重試尋找目標圖
while time.time() - start_time < timeout:
try:
pos = pyautogui.locateCenterOnScreen(img_path, confidence=confidence)
if pos:
pyautogui.click(pos)
return True
except pyautogui.ImageNotFoundException:
pass
# 加一點小的 Jitter 避免 CPU 跑滿
time.sleep(0.2)
# 徹底超時后不要報錯讓程序崩潰,返回 False 進行降級處理
print(f"[{img_path}] 未出現(xiàn),跳過。")
return False
不同投遞按鈕的解決方案
現(xiàn)象:招聘平臺的按鈕是動態(tài)的。找人溝通時,它可能是“立即溝通”,如果是聊過的 HR 則變成了“繼續(xù)溝通”。如果當日配額用完,直接彈拉窗告訴你“到達上限”。這就要求我們有一套非線性的決策機制。
If-Else 兜底分支與全局哨兵(決策樹抽象)。
import sys
def execute_apply_action():
# 1. 哨兵監(jiān)測點:如果出現(xiàn)了達到上限的提示,說明不能再跑了
if click_with_timeout("img_limit_reached.png", timeout=1.0):
print("今日溝通達上限,直接停止任務。")
sys.exit(0)
# 2. 常規(guī)決策樹兜底分支
if click_with_timeout("img_chat_now.png", timeout=2.0):
print("發(fā)現(xiàn)[立即溝通]按鈕,已點擊!")
elif click_with_timeout("img_continue_chat.png", timeout=2.0):
print("發(fā)現(xiàn)[繼續(xù)溝通]按鈕,此前聊過了,已點擊!")
else:
print("未能識別當前的投遞按鈕,為了防止亂點,直接放棄當前職位。")
辨別已投遞的解決方案
現(xiàn)象:找圖庫 locateOnScreen 雖然能找元素,但無法理解業(yè)務上下文。比如列表里某些崗位是昨天看過的,字體顏色變灰了;而新崗位是深色的。如果無法分辨,程序就會在原地無限重復點擊第一張卡片。
OpenCV 色彩空間均值分析(特征截取法)。 我們可以把一塊區(qū)域抓取下來,轉換并計算它的發(fā)色偏向(比如 RGB 通道平均亮度)。
import cv2
import numpy as np
def is_job_unread(cropped_image_path):
"""
判斷該卡片圖片區(qū)域中的標題是否沒看過。
(假設深色字體是未讀,淺灰色字體是已讀)
"""
# 1. 讀取截圖
img = cv2.imread(cropped_image_path)
# 2. 計算 B, G, R 單個通道的全局均值
mean_val = cv2.mean(img)
mean_b, mean_g, mean_r = mean_val[0], mean_val[1], mean_val[2]
# 3. 簡單的特征判定法:如果 RGB 值整體偏高(發(fā)白/淺灰),說明已經(jīng)看過
# 具體閾值可根據(jù)實際平臺的色號校準
if mean_b > 150 and mean_g > 150 and mean_r > 150:
print("該崗位為已瀏覽狀態(tài)(灰色),跳過。")
return False
print("該崗位標題偏暗/全黑,未訪問過,準備點擊。")
return True
停止方案
現(xiàn)象:由于程序是通過操控系統(tǒng)光標來運行的,一旦發(fā)生死循環(huán)(如由于縮放問題點空了),人類用戶試圖去點關閉按鈕,光標下一秒就被代碼搶走了——完全失去了控制權。
全局異步監(jiān)聽鉤子:(異步監(jiān)聽)。
import keyboard
import os
# 這個標志可以讓我們的 while 循環(huán)提前結束
RUNNING = True
def emergency_stop():
global RUNNING
RUNNING = False
print("【攔截】檢測到 ESC 鍵,緊急制動!")
os._exit(0) # 強殺進程,無論線程在阻塞什么
# 注冊系統(tǒng)最高優(yōu)先級的熱鍵
keyboard.add_hotkey('esc', emergency_stop)
def main_loop():
while RUNNING:
print("我正在自動執(zhí)行投遞...")
# 執(zhí)行投遞動作 ...
time.sleep(2)
以上就是利用Python實現(xiàn)招聘平臺自動投遞功能的詳細內(nèi)容,更多關于Python招聘平臺自動投遞的資料請關注腳本之家其它相關文章!
相關文章
基于wxpython實現(xiàn)的windows GUI程序實例
這篇文章主要介紹了基于wxpython實現(xiàn)的windows GUI程序,實例分析了windows GUI程序的相關實現(xiàn)技巧,需要的朋友可以參考下2015-05-05
Pandas操作兩個Excel實現(xiàn)數(shù)據(jù)對應行的合并
本文主要介紹了Pandas操作兩個Excel實現(xiàn)數(shù)據(jù)對應行的合并,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01
python str()如何將參數(shù)轉換為字符串類型
這篇文章主要介紹了python str()如何將參數(shù)轉換為字符串類型的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06

