
Ethan Collins
Pattern Recognition Specialist

AI招聘代理需要从主要招聘网站获取结构化的职位信息——职位名称、要求、薪酬、公司详情,以匹配候选人、分析市场趋势并自动化招聘流程。Indeed、LinkedIn和Glassdoor等招聘网站部署了CAPTCHA保护,阻止在几十次请求后自动收集数据。本指南展示了如何使用CapSolver构建招聘网站数据管道,以保持对就业平台的持续访问。
AI招聘代理需要大规模访问招聘网站来执行任务:扫描数千条职位信息以匹配候选人技能,监控跨行业的薪酬趋势,跟踪特定职位的招聘公司,并识别新兴技能需求。这些任务产生的请求量会触发就业平台的机器人检测。
招聘网站在机器人防护上投入大量资源,因为其数据具有商业价值。职位信息、薪资信息和公司评价推动订阅收入。美国劳工统计局数据显示,美国就业市场每月处理超过600万次雇佣——这些交易背后的数据对招聘技术公司价值数十亿美元。
当AI招聘代理在Indeed的搜索结果、LinkedIn的职位列表或Glassdoor的公司页面遇到CAPTCHA时,它无法继续收集用于候选人匹配和市场分析的数据。CapSolver提供了清除验证的层,使招聘数据管道持续运行。
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install aiohttp beautifulsoup4 pandas
export CAPSOLVER_API_KEY="your-capsolver-api-key"
其他要求:
JOB_BOARDS = {
"indeed": {
"name": "Indeed",
"captcha_type": "ReCaptchaV2TaskProxyLess",
"trigger": "after_30_searches",
"data_fields": ["title", "company", "location", "salary", "description", "posted_date"]
},
"linkedin_jobs": {
"name": "LinkedIn Jobs",
"captcha_type": "AntiTurnstileTaskProxyLess",
"trigger": "rate_limit_and_behavioral",
"data_fields": ["title", "company", "location", "level", "employment_type", "applicants"]
},
"glassdoor": {
"name": "Glassdoor",
"captcha_type": "ReCaptchaV2TaskProxyLess",
"trigger": "after_40_page_views",
"data_fields": ["title", "company", "salary_range", "rating", "reviews", "benefits"]
},
"ziprecruiter": {
"name": "ZipRecruiter",
"captcha_type": "AntiTurnstileTaskProxyLess",
"trigger": "rate_limit_60_per_hour",
"data_fields": ["title", "company", "salary", "location", "skills", "posted_date"]
}
}
使用CapSolver浏览器扩展在每个招聘网站上识别CAPTCHA参数。
import asyncio
from capsolver_core import create_capsolver, CaptchaType, CaptchaInfo
class JobBoardCollector:
"""收集职位信息数据并处理CAPTCHA。"""
def __init__(self, api_key: str, proxies: list):
self.cap = create_capsolver(api_key=api_key)
self.proxies = proxies
self.proxy_idx = 0
self.stats = {"listings_collected": 0, "captchas_solved": 0}
async def search_jobs(self, query: str, location: str, platform: str = "indeed") -> list:
"""搜索职位信息并处理CAPTCHA。"""
proxy = self.proxies[self.proxy_idx % len(self.proxies)]
self.proxy_idx += 1
html = await self._fetch_search(platform, query, location, proxy)
if self._is_captcha(html):
token = await self._solve(platform)
html = await self._retry(platform, query, location, proxy, token)
self.stats["captchas_solved"] += 1
listings = self._parse_listings(html)
self.stats["listings_collected"] += len(listings)
return listings
async def _solve(self, platform_key: str) -> str:
"""解决招聘网站的CAPTCHA。"""
platform = JOB_BOARDS[platform_key]
type_map = {
"ReCaptchaV2TaskProxyLess": CaptchaType.RECAPTCHA_V2,
"AntiTurnstileTaskProxyLess": CaptchaType.CLOUDFLARE
}
info = CaptchaInfo(
type=type_map[platform["captcha_type"]],
website_url=f"https://www.{platform_key.replace('_', '')}.com",
website_key=platform.get("site_key", "")
)
solution = await self.cap.solve(info)
return solution.token
async def collect_salary_data(self, role: str, location: str) -> dict:
"""收集特定职位和地点的薪资数据。"""
results = {}
for platform in ["indeed", "glassdoor", "ziprecruiter"]:
listings = await self.search_jobs(f"{role} salary", location, platform)
salaries = [l.get("salary") for l in listings if l.get("salary")]
if salaries:
results[platform] = {
"min": min(salaries),
"max": max(salaries),
"median": sorted(salaries)[len(salaries)//2],
"sample_size": len(salaries)
}
await asyncio.sleep(5)
return results
async def close(self):
await self.cap.aclose()
CapSolver API文档涵盖了优化高频数据收集的解决时间。
class RecruitingIntelligence:
"""AI招聘代理的数据层。"""
def __init__(self, collector: JobBoardCollector):
self.collector = collector
async def market_analysis(self, role: str, locations: list) -> dict:
"""分析特定职位在不同地区的就业市场。"""
analysis = {}
for location in locations:
listings = await self.collector.search_jobs(role, location)
analysis[location] = {
"total_openings": len(listings),
"companies_hiring": list(set(l.get("company") for l in listings if l.get("company"))),
"common_skills": self._extract_skills(listings),
"salary_range": self._salary_range(listings)
}
await asyncio.sleep(5)
return analysis
async def track_hiring_trends(self, companies: list, period_days: int = 30) -> dict:
"""跟踪特定公司的招聘活动。"""
trends = {}
for company in companies:
listings = await self.collector.search_jobs(company, "remote")
trends[company] = {
"active_listings": len(listings),
"roles": [l.get("title") for l in listings[:10]],
"locations": list(set(l.get("location") for l in listings if l.get("location")))
}
await asyncio.sleep(5)
return trends
def _extract_skills(self, listings: list) -> list:
"""从职位描述中提取常见技能。"""
# 简化的技能提取
all_skills = []
for listing in listings:
desc = listing.get("description", "").lower()
common_skills = ["python", "javascript", "sql", "aws", "react", "machine learning", "docker", "kubernetes"]
for skill in common_skills:
if skill in desc:
all_skills.append(skill)
from collections import Counter
return [s for s, _ in Counter(all_skills).most_common(10)]
| 监控范围 | 每日搜索次数 | 每月CAPTCHA次数 | 每月成本 |
|---|---|---|---|
| 10个职位,3个地点 | ~90 | ~270 | $0.54-0.81 |
| 50个职位,5个地点 | ~750 | ~2,250 | $4.50-6.75 |
| 200个职位,10个地点 | ~6,000 | ~18,000 | $36-54 |
优化策略:
领取您的优惠码:在CapSolver仪表板使用代码WEBS,每次充值可获得额外5%的奖励。非常适合构建AI招聘代理的HR科技团队。
CapSolver关于负责任使用的常见问题提供了更多指导。CapSolver网络爬虫文档涵盖了高容量收集的基础设施模式。对于Cloudflare保护的招聘网站,Turnstile文档提供了具体的实现细节。
为AI招聘代理构建招聘网站数据管道需要分析平台的CAPTCHA系统,使用CapSolver实现异步解决,并在收集的数据上构建智能功能。住宅代理、会话管理和自动化CAPTCHA解决的结合使在主要就业平台上的可靠数据收集成为可能。
此方法适用于使用标准CAPTCHA系统的平台:Indeed、LinkedIn Jobs、Glassdoor、ZipRecruiter、Monster、CareerBuilder和大多数地区性招聘网站。每个都需要特定的CAPTCHA参数识别。
对于活跃招聘,每日收集可在24小时内捕获新职位。对于市场分析和趋势跟踪,每周2-3次就足够了。高需求职位(工程、AI/ML)可通过每日两次监控获益。
每天检查50个职位和5个地点,每月大约2,250次CAPTCHA,每1,000次解决费用2-3美元,每月成本为4.50-6.75美元。加上代理费用,总基础设施成本低于40美元/月。
可以。结构化的职位信息(要求、技能、经验水平)结合候选人档案可实现AI匹配。关键是从业务描述中提取结构化的技能要求,并与候选人资格进行比较。
LinkedIn使用了超出标准CAPTCHA的多层保护。保持真实的会话行为,使用住宅代理,并将请求频率限制在每小时20-30次。专注于公开可访问的职位列表而非个人资料数据,并遵守LinkedIn的自动化访问条款。