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

 更新时间:2026年05月07日 08:21:33   作者:我叫黑大帅  
本文介绍了如何使用Python实现招聘平台自动化投递,采用纯视觉与键鼠模拟的UI自动化,核心依赖opencv-python、pyautogui等库,针对不同按钮、未投递判断及死循环等问题,提出了动态轮询、决策树抽象、色彩空间分析及全局异步监听等解决方案,需要的朋友可以参考下

引言

在自动化招聘投递的场景中,传统的基于 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实现招聘平台自动投递功能的详细内容,更多关于Python招聘平台自动投递的资料请关注脚本之家其它相关文章!

相关文章

  • python中使用ctypes调用so传参设置遇到的问题及解决方法

    python中使用ctypes调用so传参设置遇到的问题及解决方法

    这篇文章主要介绍了python中使用ctypes调用so传参设置,本文较详细的给大家介绍了遇到问题及解决方案,需要的朋友可以参考下
    2019-06-06
  • django做form表单的数据验证过程详解

    django做form表单的数据验证过程详解

    这篇文章主要介绍了django做form表单的数据验证过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • python使用jenkins发送企业微信通知的实现

    python使用jenkins发送企业微信通知的实现

    公司使用的是企业微信,因此考虑Jenkins通知企业微信机器人的实现方式,本文主要介绍了python使用jenkins发送企业微信通知的实现,感兴趣的可以了解一下
    2021-06-06
  • Python实现的拟合二元一次函数功能示例【基于scipy模块】

    Python实现的拟合二元一次函数功能示例【基于scipy模块】

    这篇文章主要介绍了Python实现的拟合二元一次函数功能,结合实例形式分析了Python基于scipy模块进行二元一次函数拟合相关科学运算操作实现技巧,需要的朋友可以参考下
    2018-05-05
  • python神经网络ResNet50模型的复现详解

    python神经网络ResNet50模型的复现详解

    这篇文章主要为大家介绍了python神经网络ResNet50模型的复现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Pytorch使用卷积神经网络对CIFAR10图片进行分类方式

    Pytorch使用卷积神经网络对CIFAR10图片进行分类方式

    这篇文章主要介绍了Pytorch使用卷积神经网络对CIFAR10图片进行分类方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python中的元组(Tuple)操作实例详解

    Python中的元组(Tuple)操作实例详解

    Python 元组和列表很像,也是一个包含多个元素的集合,下面这篇文章主要给大家介绍了关于Python中元组(Tuple)操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • python+selenium实现163邮箱自动登陆的方法

    python+selenium实现163邮箱自动登陆的方法

    本篇文章主要介绍了python+selenium实现163邮箱自动登陆的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Python使用pip工具实现包自动更新的多种方法

    Python使用pip工具实现包自动更新的多种方法

    本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/CD的实现方案,以及最佳实践和安全考量,文章包含详细的代码示例、流程图解和实际应用场景分析,需要的朋友可以参考下
    2025-07-07
  • Python中最好用的json库orjson用法详解

    Python中最好用的json库orjson用法详解

    orjson是一个用于python的快速、正确的json库,它的基准是 json最快的python库,具有全面的单元、集成和互操作性测试,下面这篇文章主要给大家介绍了关于Python中最好用的json库orjson用法的相关资料,需要的朋友可以参考下
    2022-06-06

最新评论