Python招聘平台自动投递实战:视觉模拟点击与异常处理方案
引言
在自动化招聘投递场景中,传统基于 DOM 树的浏览器自动化(如 Selenium/Playwright)常面临高维护成本与严格反爬风控。平台一旦更新页面结构,脚本便会失效。另一种思路是采用纯视觉与键鼠模拟的 UI 自动化,其操作逻辑与人类行为一致,平台难以从流量特征上辨别。
核心技术栈
此类框架主要依赖几个标准库协同工作:
opencv-python:用于图像色彩分析、轮廓提取。pyautogui/pyscreeze:提供底层鼠标点击、滚轮滑动及基础截图找图功能。pyperclip:绕过键鼠输入限制,用于发送中文文本和表情。keyboard:系统级全局键盘钩子,用于异常时紧急中断。
自动化流程可概括为“截图 ➔ 找图 ➔ 点击”三步,其中“找图”环节最容易导致程序停止。
网速不稳定的解决方案
点击岗位后,详情页加载时间可能从 0.1 秒到 3 秒不等。若硬编码 time.sleep(3) 效率低下,写短了则可能因找不到按钮而报错崩溃。可采用动态轮询与超时弃权机制:不使用固定等待,而是高频捕捉屏幕元素,一旦出现立即动作,超时则静默跳过。
import time
import pyautogui
def click_with_timeout(img_path, confidence=0.8, timeout=3.0):
start_time = time.time()
# 在 timeout 秒内不断重试寻找目标图
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}] 未出现,跳过。")
return False
不同投递按钮的解决方案
招聘平台的按钮是动态的:找人沟通时可能显示“立即沟通”,聊过的 HR 则变为“继续沟通”;当日配额用完会弹出“到达上限”提示。这需要非线性决策机制,采用 If-Else 兜底分支与全局哨兵。
import sys
def execute_apply_action():
# 1. 哨兵监测点:如果出现达到上限提示,停止任务
if click_with_timeout("img_limit_reached.png", timeout=1.0):
print("今日沟通达上限,直接停止任务。")
sys.exit(0)
# 2. 常规决策树兜底分支
if click_with_timeout("img_chat_now.png", timeout=2.0):
print("发现[立即沟通]按钮,已点击!")
elif click_with_timeout("img_continue_chat.png", timeout=2.0):
print("发现[继续沟通]按钮,此前聊过了,已点击!")
else:
print("未能识别当前的投递按钮,为了防止乱点,直接放弃当前职位。")
辨别已投递的解决方案
locateOnScreen 虽能找元素,但无法理解业务上下文。例如,已浏览的岗位字体变灰,新岗位为深色,若无法分辨,程序会重复点击同一卡片。可采用 OpenCV 色彩空间均值分析:抓取区域图像,计算 RGB 通道平均亮度,判断是否已读。
import cv2
import numpy as np
def is_job_unread(cropped_image_path):
"""
判断该卡片图片区域中的标题是否没看过。
(假设深色字体是未读,浅灰色字体是已读)
"""
# 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 值整体偏高(发白/浅灰),说明已看过
# 具体阈值可根据实际平台色号校准
if mean_b > 150 and mean_g > 150 and mean_r > 150:
print("该岗位为已浏览状态(灰色),跳过。")
return False
print("该岗位标题偏暗/全黑,未访问过,准备点击。")
return True
停止方案
程序操控系统光标时,若发生死循环(如缩放问题导致点空),用户可能无法控制鼠标。可通过全局异步监听钩子实现紧急停止。
import keyboard
import os
# 标志让 while 循环提前结束
RUNNING = True
def emergency_stop():
global RUNNING
RUNNING = False
print("【拦截】检测到 ESC 键,紧急制动!")
os._exit(0) # 强杀进程,无论线程在阻塞什么
# 注册系统最高优先级的热键
keyboard.add_hotkey('esc', emergency_stop)
def main_loop():
while RUNNING:
print("我正在自动执行投递...")
# 执行投递动作 ...
time.sleep(2)
以上是 Python 实现招聘平台自动投递的关键技术方案,涵盖动态等待、按钮识别、状态判断及紧急停止等核心环节。
原文链接:本站整理
本文来自互联网用户投稿,该文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 service@2cto.cc 进行投诉反馈,一经查实,立即处理!
您可能感兴趣的文章:
下一篇:Python执行多行cmd命令:单&与双&&的区别详解