多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

利用Python实现招聘平台自动投递功能

利用Python实现招聘平台自动投递功能 引言在自动化招聘投递的场景中传统的基于 DOM 树的浏览器自动化如 Selenium/Playwright往往面临极高的维护成本与严格反爬风控。一旦平台更新页面结构脚本就会立刻失效。与之相对的另一种解决方案是降维打击采用纯视觉与键鼠模拟的 UI 自动化。这种模式与人类肉眼看屏幕、用手点鼠标的逻辑完全一致平台极难从流量特征上辨别。核心技术栈这类框架主要只依赖几个标准库协同opencv-python用于图像色彩分析、轮廓提取。pyautogui/pyscreeze提供底层的鼠标点击、滚轮滑动以及基础截图找图。pyperclip用于绕过键鼠输入的字符限制负责中文文本和表情发送。keyboard系统级全局键盘钩子用于在发生异常时紧急中断。所谓的自动化其实就三步走“截图 ➔ 找图 ➔ 点击”;在这里最容易导致程序停止的就是“找图”这个关键网速不稳定的解决方案现象点击岗位后详情页有时 0.1 秒加载好有时卡 3 秒。如果硬写time.sleep(3)效率极低写短了会找不到按钮而报错崩溃。动态轮询与超时弃权机制动态找图点击。不使用固定等待通过高频捕捉屏幕元素一旦出现马上动作到了时限依然没有就静默跳过。12345678910111213141516171819202122importtimeimportpyautoguidefclick_with_timeout(img_path, confidence0.8, timeout3.0):start_timetime.time()# 在 timeout 秒内不断重试寻找目标图whiletime.time()-start_time timeout:try:pospyautogui.locateCenterOnScreen(img_path, confidenceconfidence)ifpos:pyautogui.click(pos)returnTrueexceptpyautogui.ImageNotFoundException:pass# 加一点小的 Jitter 避免 CPU 跑满time.sleep(0.2)# 彻底超时后不要报错让程序崩溃返回 False 进行降级处理print(f[{img_path}] 未出现跳过。)returnFalse不同投递按钮的解决方案现象招聘平台的按钮是动态的。找人沟通时它可能是“立即沟通”如果是聊过的 HR 则变成了“继续沟通”。如果当日配额用完直接弹拉窗告诉你“到达上限”。这就要求我们有一套非线性的决策机制。If-Else 兜底分支与全局哨兵决策树抽象。123456789101112131415importsysdefexecute_apply_action():# 1. 哨兵监测点如果出现了达到上限的提示说明不能再跑了ifclick_with_timeout(img_limit_reached.png, timeout1.0):print(今日沟通达上限直接停止任务。)sys.exit(0)# 2. 常规决策树兜底分支ifclick_with_timeout(img_chat_now.png, timeout2.0):print(发现[立即沟通]按钮已点击)elifclick_with_timeout(img_continue_chat.png, timeout2.0):print(发现[继续沟通]按钮此前聊过了已点击)else:print(未能识别当前的投递按钮为了防止乱点直接放弃当前职位。)辨别已投递的解决方案现象找图库locateOnScreen虽然能找元素但无法理解业务上下文。比如列表里某些岗位是昨天看过的字体颜色变灰了而新岗位是深色的。如果无法分辨程序就会在原地无限重复点击第一张卡片。OpenCV 色彩空间均值分析特征截取法。我们可以把一块区域抓取下来转换并计算它的发色偏向比如 RGB 通道平均亮度。1234567891011121314151617181920212223importcv2importnumpy as npdefis_job_unread(cropped_image_path):判断该卡片图片区域中的标题是否没看过。(假设深色字体是未读浅灰色字体是已读)# 1. 读取截图imgcv2.imread(cropped_image_path)# 2. 计算 B, G, R 单个通道的全局均值mean_valcv2.mean(img)mean_b, mean_g, mean_rmean_val[0], mean_val[1], mean_val[2]# 3. 简单的特征判定法如果 RGB 值整体偏高(发白/浅灰)说明已经看过# 具体阈值可根据实际平台的色号校准ifmean_b 150andmean_g 150andmean_r 150:print(该岗位为已浏览状态灰色跳过。)returnFalseprint(该岗位标题偏暗/全黑未访问过准备点击。)returnTrue停止方案现象由于程序是通过操控系统光标来运行的一旦发生死循环如由于缩放问题点空了人类用户试图去点关闭按钮光标下一秒就被代码抢走了——完全失去了控制权。全局异步监听钩子异步监听。1234567891011121314151617181920importkeyboardimportos# 这个标志可以让我们的 while 循环提前结束RUNNINGTruedefemergency_stop():globalRUNNINGRUNNINGFalseprint(【拦截】检测到 ESC 键紧急制动)os._exit(0)# 强杀进程无论线程在阻塞什么# 注册系统最高优先级的热键keyboard.add_hotkey(esc, emergency_stop)defmain_loop():whileRUNNING:print(我正在自动执行投递...)# 执行投递动作 ...time.sleep(2)以上就是利用Python实现招聘平台自动投递功能的详细内容
返回列表