
Anh Tuan
Data Science Expert

Các đại diện tuyển dụng AI cần dữ liệu danh sách việc làm có cấu trúc — tiêu đề, yêu cầu, mức lương, thông tin công ty — từ các bảng việc làm lớn để khớp ứng viên, phân tích xu hướng thị trường và tự động hóa quy trình thu thập dữ liệu. Các bảng việc làm như Indeed, LinkedIn và Glassdoor triển khai bảo vệ CAPTCHA chặn việc thu thập dữ liệu tự động sau vài chục yêu cầu. Hướng dẫn này sẽ chỉ cho bạn cách xây dựng luồng dữ liệu bảng việc làm cho các đại diện tuyển dụng AI sử dụng CapSolver để duy trì truy cập liên tục vào các nền tảng việc làm.
Các đại diện tuyển dụng AI thực hiện các nhiệm vụ yêu cầu truy cập quy mô lớn vào bảng việc làm: quét hàng nghìn danh sách để khớp kỹ năng ứng viên, giám sát xu hướng mức lương across các ngành, theo dõi các công ty đang tuyển dụng cho các vị trí cụ thể và xác định yêu cầu kỹ năng mới nổi. Mỗi nhiệm vụ này tạo ra khối lượng yêu cầu khiến các nền tảng việc làm phát hiện bot.
Các bảng việc làm đầu tư mạnh vào bảo vệ bot vì dữ liệu của họ có giá trị thương mại. Dữ liệu danh sách, thông tin mức lương và đánh giá công ty tạo ra doanh thu đăng ký. Dữ liệu của Cục Thống kê Lao động Hoa Kỳ cho thấy thị trường việc làm Hoa Kỳ xử lý hơn 6 triệu cuộc tuyển dụng mỗi tháng — dữ liệu nền tảng cho các giao dịch này có giá trị hàng tỷ USD đối với các công ty công nghệ tuyển dụng.
Khi một đại diện tuyển dụng AI gặp CAPTCHA trên kết quả tìm kiếm của Indeed, danh sách việc làm của LinkedIn hoặc trang công ty của Glassdoor, nó không thể tiếp tục thu thập dữ liệu cần thiết để khớp ứng viên và phân tích thị trường. CapSolver cung cấp lớp xác minh xóa bỏ giúp luồng dữ liệu tuyển dụng hoạt động liên tục.
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install aiohttp beautifulsoup4 pandas
export CAPSOLVER_API_KEY="your-capsolver-api-key"
Yêu cầu bổ sung:
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"]
}
}
Sử dụng phần mềm mở rộng CapSolver để xác định tham số CAPTCHA trên mỗi bảng việc làm.
import asyncio
from capsolver_core import create_capsolver, CaptchaType, CaptchaInfo
class JobBoardCollector:
"""Thu thập dữ liệu danh sách việc làm với xử lý 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:
"""Tìm kiếm danh sách việc làm với xử lý 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:
"""Giải CAPTCHA cho bảng việc làm."""
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:
"""Thu thập dữ liệu mức lương cho một vai trò và vị trí cụ thể."""
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()
Thông tin tài liệu API CapSolver bao gồm các cách tối ưu hóa thời gian giải cho thu thập dữ liệu tần suất cao.
class RecruitingIntelligence:
"""Lớp dữ liệu cho đại diện tuyển dụng AI."""
def __init__(self, collector: JobBoardCollector):
self.collector = collector
async def market_analysis(self, role: str, locations: list) -> dict:
"""Phân tích thị trường việc làm cho một vai trò cụ thể across các vị trí."""
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:
"""Theo dõi hoạt động tuyển dụng cho các công ty cụ thể."""
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:
"""Trích xuất kỹ năng phổ biến từ mô tả việc làm."""
# Trích xuất kỹ năng đơn giản
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)]
| Phạm vi giám sát | Tìm kiếm hàng ngày | CAPTCHA hàng tháng | Chi phí hàng tháng |
|---|---|---|---|
| 10 vai trò, 3 vị trí | ~90 | ~270 | $0.54-0.81 |
| 50 vai trò, 5 vị trí | ~750 | ~2,250 | $4.50-6.75 |
| 200 vai trò, 10 vị trí | ~6,000 | ~18,000 | $36-54 |
Chiến lược tối ưu hóa:
Nhận Mã Ưu Đãi Của Bạn: Sử dụng mã WEBS tại Bảng điều khiển CapSolver để nhận thêm 5% ưu đãi cho mỗi lần nạp tiền. Lý tưởng cho các đội công nghệ HR xây dựng các đại diện tuyển dụng AI.
FAQ của CapSolver về sử dụng có trách nhiệm cung cấp hướng dẫn bổ sung. Tài liệu web scraping của CapSolver bao gồm các mẫu cơ sở hạ tầng cho thu thập khối lượng lớn. Đối với các bảng việc làm được bảo vệ bởi Cloudflare, tài liệu Turnstile cung cấp chi tiết triển khai cụ thể.
Việc xây dựng luồng dữ liệu bảng việc làm cho các đại diện tuyển dụng AI yêu cầu phân tích hệ thống CAPTCHA của nền tảng, triển khai giải CAPTCHA bất đồng bộ với CapSolver và xây dựng các tính năng thông minh trên dữ liệu đã thu thập. Sự kết hợp giữa proxy nhà ở, quản lý phiên và giải CAPTCHA tự động cho phép thu thập dữ liệu đáng tin cậy trên các nền tảng việc làm lớn.
Phương pháp này hoạt động với các nền tảng sử dụng hệ thống CAPTCHA tiêu chuẩn: Indeed, LinkedIn Jobs, Glassdoor, ZipRecruiter, Monster, CareerBuilder và hầu hết các bảng việc làm khu vực. Mỗi nền tảng yêu cầu xác định tham số CAPTCHA cụ thể.
Đối với tuyển dụng tích cực, thu thập hàng ngày bắt kịp các bài đăng mới trong 24 giờ. Đối với phân tích thị trường và theo dõi xu hướng, 2-3 lần mỗi tuần là đủ. Các vai trò có nhu cầu cao (kỹ sư, AI/ML) được hưởng lợi từ việc giám sát hai lần mỗi ngày.
Với 50 vai trò và 5 vị trí được kiểm tra hàng ngày, khoảng 2.250 CAPTCHA mỗi tháng với giá $2-3 mỗi 1.000 lần giải, tổng chi phí là $4,50-6,75 mỗi tháng. Thêm chi phí proxy cho tổng cơ sở hạ tầng dưới $40/tháng.
Có. Dữ liệu danh sách việc làm có cấu trúc (yêu cầu, kỹ năng, cấp độ kinh nghiệm) kết hợp với hồ sơ ứng viên cho phép khớp AI. Yếu tố quan trọng là trích xuất yêu cầu kỹ năng có cấu trúc từ mô tả việc làm và so sánh chúng với trình độ ứng viên.
LinkedIn sử dụng nhiều lớp bảo vệ ngoài CAPTCHA tiêu chuẩn. Duy trì hành vi phiên thực tế, sử dụng proxy nhà ở và giới hạn tần suất yêu cầu xuống 20-30 mỗi giờ. Tập trung vào các danh sách việc làm công khai thay vì dữ liệu hồ sơ, và tuân thủ điều khoản dịch vụ của LinkedIn cho truy cập tự động.
Học kiến trúc gỡ mã web Rust có thể mở rộng với reqwest, scraper, gỡ mã bất đồng bộ, gỡ mã trình duyệt không đầu, xoay proxy và xử lý CAPTCHA tuân thủ.

Tự động hóa việc giải CAPTCHA với Nanobot và CapSolver. Sử dụng Playwright để giải reCAPTCHA và Cloudflare tự động.
