手记

BOSS直聘自动化投递

前言

Boss直聘是一个口碑还不错的招聘网站,并且网站非常适合自动化海投。本文主要基于Selenium框架进行自动化海投。

参数定义

自动化脚本主要包含两个参数,job_list为自动化投递关键词列表,base_url为自动化投递基础url。

其中base_url可以指定投递城市,例如100010000代表全国,101020100代表上海。

job_list = [
    '机器学习 实习',
]
driver = webdriver.Chrome()
base_url = 'https://www.zhipin.com/job_detail/?query={}&scity=101020100&industry=&position='

如何获得城市编码?

  1. 选择城市
  2. 地址栏查看编码

登陆思路

由于账户密码登录Boss直聘设置了验证码机制,因此为了简化登录流程,采用了二维码登录方式,通过二维码登录可以避免输入验证码。

二维码登陆完成之后,需要向控制台输入任意字符,通知自动化脚本继续运行。

def login():
    driver.get('https://sao.zhipin.com/')
    print('页面加载完成,请手动验证后输入任意字符')
    input()

扫描所有页面

自动化脚本根据是否存在下一页按钮判断扫描是否完成,如果存在可点击的下一页按钮,则通过点击下一页按钮的形式进行下一页的扫描。

def run():
    login()
    for job in job_list:
        url = base_url.format(job)
        items = []
        first_page = True
        while True:
            driver.get(url)
            try:
                # 用于等待下一页的按钮出现后再进行点击
                WebDriverWait(driver=driver, timeout=5).until(
                    EC.presence_of_element_located((By.XPATH, '//div[@class="page"]/a[last()]')))
            except:
                # 有可能不存在下一页按钮
                pass
            # 页面加载完毕后 解析页面
            items.extend(parse_list_page(driver, first_page))
            first_page = False
            try:
                next_bt = driver.find_element_by_xpath('//div[@class="page"]/a[last()]')
                # 判断是否到了最后一页
                if "disabled" in next_bt.get_attribute('class'):
                    break
                else:
                    url = next_bt.get_attribute('href')
            except:
                # 有可能不存在下一页按钮
                break
        for item in items:
            request_detail_page(item.link)

页面解析

BOSS直聘的招聘信息列表分为两种投递状态:继续沟通和立即沟通。

如果按钮文字是继续沟通,则代表该岗位已经投递过,会在控制台输出岗位信息。

如果按钮文字是立即沟通,则代表该岗位没有被投递过,自动化脚本会在内存中记录岗位投递地址,以便后续投递操作。

def parse_list_page(driver, first_page):
    if first_page:
        links: ElementList = WebDriverWait(driver=driver, timeout=10).until(
            EC.presence_of_all_elements_located((By.XPATH, '//*[@id="main"]/div/div[3]/ul/li')))
    else:
        links: ElementList = WebDriverWait(driver=driver, timeout=10).until(
            EC.presence_of_all_elements_located((By.XPATH, '//*[@id="main"]/div/div[2]/ul/li')))
    items = []
    for temp in links:
        link = temp.find_element_by_xpath('./div/div[1]/h3/a')
        job = link.find_element_by_class_name('job-title').text
        company = temp.find_element_by_class_name('company-text').text
        href = link.get_attribute('href')
        btn = temp.find_element_by_xpath('./div/a')
        if '继续沟通' in btn.get_attribute('innerHTML'):
            print('已投递过', company)
        else:
            item = LagouItem(href, company, job)
            print(item)
            items.append(item)
    return items

自动化投递

扫描完成后,打开每一个岗位链接,点击投递按钮即可。

def request_detail_page(url):
    # 用新窗口打开页面
    url = url
    driver.get(url)
    # 等待页面加载完成
    WebDriverWait(driver, timeout=10).until(
        EC.presence_of_element_located((By.XPATH, '//*[@id="main"]/div[1]/div/div/div[3]/div[1]/a')))
    btn = driver.find_element_by_xpath('//*[@id="main"]/div[1]/div/div/div[3]/div[1]/a')
    if btn.text == '立即沟通':
        print('发现目标,点击投递')
        btn.click()
    elif btn.text == '继续沟通':
        print('已投递过', url)

备注

自动化脚本基本实现了自动化投递,但是Boss直聘每天有投递上限,如果达到投递上限,自动化脚本会抛异常终止。目前自动化脚本尚未针对投递上限情况进行处理。

完整代码

3人推荐
随时随地看视频
慕课网APP