最近在帮朋友优化求职流程时,发现重复性的职位搜索和申请工作消耗了大量时间。于是尝试用Python构建了一个自动化系统,通过抓取招聘网站数据实现智能职位匹配和自动申请。这个方案将传统需要数小时的手动操作压缩到几分钟内完成,同时通过条件筛选提高了岗位匹配精准度。
核心流程分为三个模块:首先用Scrapy框架抓取目标网站的职位信息,然后通过预设条件(如薪资范围、技能要求、地理位置)进行自动过滤,最后调用Selenium完成一键投递。测试期间,系统在Indeed和LinkedIn上实现了85%的申请成功率,平均每个岗位处理时间仅需23秒。
选择Scrapy而非Requests库主要考虑三点:一是内置的异步处理机制可同时抓取多个页面;二是自动的请求去重和重试机制保障稳定性;三是XPath/CSS选择器组合使字段提取更灵活。针对反爬措施,我们配置了:
python复制DOWNLOAD_DELAY = 2.5
CONCURRENT_REQUESTS_PER_DOMAIN = 1
ROBOTSTXT_OBEY = True
实际抓取时发现LinkedIn采用动态加载,通过分析其API接口发现可用如下方式获取结构化数据:
python复制def parse(self, response):
data = json.loads(response.xpath('//script[@type="application/ld+json"]/text()').get())
yield {
'title': data['title'],
'company': data['hiringOrganization']['name'],
'location': data['jobLocation']['address']['addressLocality']
}
采用基于权重的匹配算法,为不同条件分配优先级分数。例如Python技能设为50分,5年经验加30分,远程办公加20分。当总分超过阈值(通常设为70)时触发自动申请。核心计算逻辑:
python复制def calculate_match(job_desc):
score = 0
keywords = {
'python': 50,
'django': 30,
'aws': 20,
'remote': 15
}
for term, value in keywords.items():
if term in job_desc.lower():
score += value
return score > THRESHOLD
测试中发现直接匹配关键词可能误判,后来加入NLTK的词形还原处理(lemmatization)提升准确率:
python复制from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
normalized_text = [lemmatizer.lemmatize(word) for word in text.split()]
针对不同招聘网站开发定制化操作脚本。以Indeed为例,完整申请流程包括:
python复制WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "apply-button"))
).click()
python复制driver.find_element(By.XPATH, "//input[@type='file']").send_keys(resume_path)
python复制fields = {
'firstName': 'John',
'lastName': 'Doe',
'email': 'john@example.com'
}
for id, value in fields.items():
driver.find_element(By.ID, id).send_keys(value)
遇到reCAPTCHA时采用三种策略:一是设置足够长的操作间隔(每个步骤间隔3-5秒);二是复用已登录的浏览器会话;三是自动识别验证码出现时机,转为人工干预模式。关键检测代码:
python复制try:
if driver.find_elements(By.CLASS_NAME, 'g-recaptcha'):
print('Captcha detected - pausing for manual intervention')
time.sleep(300) # 5分钟人工处理窗口
except StaleElementReferenceException:
pass
初期遇到IP被封问题,通过以下措施解决:
python复制USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)'
]
headers = {'User-Agent': random.choice(USER_AGENTS)}
监测发现部分申请因简历格式被拒,改进方案:
python复制pdf_reader = PyPDF2.PdfFileReader(open(jd_path, 'rb'))
text = ''.join([pdf_reader.getPage(i).extractText() for i in range(pdf_reader.numPages)])
虽然技术可行,但需要注意:
实际使用中,我将系统限制为每天不超过20个自动申请,且仅针对明确接受批量申请的职位类型。系统运行三个月后,朋友收到的面试邀约率比纯手动申请时期提高了40%,但最终offer获取率相当——这说明自动化更适合扩大申请基数,而非替代精准求职。