Quay lại blog

Proxy cho việc thu thập dữ liệu từ hh.ru, Superjob và LinkedIn: hướng dẫn chi tiết

Hướng dẫn chi tiết về cách cấu hình proxy để thu thập dữ liệu từ các trang việc làm: chọn loại proxy, vượt qua bảo mật hh.ru và Superjob, cấu hình xoay vòng IP và xử lý captcha.

📅12 tháng 3, 2026

Thu thập dữ liệu từ các trang tuyển dụng là một trong những kịch bản thu thập dữ liệu được yêu cầu nhiều nhất cho phân tích HR, giám sát thị trường lao động và tự động hóa tuyển dụng. Nhưng các trang tuyển dụng tích cực bảo vệ chống lại việc thu thập dữ liệu tự động: chặn IP sau 50-100 yêu cầu, hiển thị captcha và cấm các tài khoản đáng ngờ. Trong bài viết này, chúng ta sẽ tìm hiểu cách cấu hình proxy đúng cách để thu thập dữ liệu ổn định từ hh.ru, Superjob, LinkedIn và các nền tảng khác mà không bị chặn.

Tại sao các trang tuyển dụng chặn việc thu thập dữ liệu và cách hoạt động của bảo vệ

Các trang tuyển dụng mất tiền vì việc thu thập dữ liệu: dữ liệu được bán cho đối thủ cạnh tranh, các trang tổng hợp được tạo ra không có giấy phép, nhà tuyển dụng bỏ qua việc đăng tin trả phí. Do đó, tất cả các nền tảng lớn đã triển khai bảo vệ nhiều lớp chống lại việc thu thập dữ liệu tự động.

Các phương pháp bảo vệ chính của các trang tuyển dụng:

  • Giới hạn tốc độ theo IP — hh.ru chặn IP sau 80-120 yêu cầu mỗi giờ, Superjob — sau 50-70 yêu cầu. Việc chặn có thể kéo dài từ 1 giờ đến cả ngày.
  • Fingerprinting trình duyệt — các trang web phân tích User-Agent, tiêu đề HTTP, độ phân giải màn hình, phông chữ đã cài đặt. Nếu dữ liệu không khớp với trình duyệt thực — yêu cầu bị chặn.
  • Kiểm tra JavaScript — nhiều trang web sử dụng Cloudflare hoặc các script riêng để kiểm tra rằng yêu cầu đến từ trình duyệt thực, không phải bot.
  • Bẫy Honeypot — các liên kết và trường ẩn mà chỉ có trình thu thập dữ liệu mới thấy. Nếu bot truy cập chúng — IP sẽ vào danh sách đen.
  • Captcha khi có hoạt động đáng ngờ — xuất hiện sau một loạt yêu cầu nhanh hoặc khi sử dụng IP trung tâm dữ liệu.

Không có proxy, bạn chỉ có thể thu thập tối đa 100-200 tin tuyển dụng, sau đó IP của bạn sẽ bị cấm. Để thu thập dữ liệu quy mô lớn (hàng nghìn tin tuyển dụng mỗi ngày), proxy trở thành công cụ bắt buộc.

Quan trọng: Việc thu thập dữ liệu phải tuân thủ điều khoản sử dụng của trang web. Nhiều trang tuyển dụng cung cấp API chính thức để truy cập dữ liệu hợp pháp. Ví dụ, hh.ru có API miễn phí với giới hạn yêu cầu, phù hợp cho hầu hết các nhiệm vụ.

Chọn loại proxy nào để thu thập dữ liệu tuyển dụng

Việc lựa chọn loại proxy phụ thuộc vào quy mô thu thập dữ liệu, ngân sách và yêu cầu về tốc độ. Hãy xem xét ba lựa chọn chính với các kịch bản sử dụng cụ thể.

Loại proxy Tốc độ Rủi ro bị cấm Khi nào sử dụng
Datacenter Cao (50-200 ms) Cao Kiểm tra trình thu thập, thu thập dữ liệu công khai không cần đăng nhập
Residential Trung bình (200-800 ms) Thấp Thu thập dữ liệu quy mô lớn từ hh.ru, Superjob với luân chuyển IP
Mobile Trung bình (300-1000 ms) Rất thấp Thu thập với đăng nhập, vượt qua bảo vệ nghiêm ngặt của LinkedIn

Proxy datacenter để thu thập dữ liệu

Đây là lựa chọn nhanh nhất và rẻ nhất, nhưng có hạn chế. IP datacenter dễ dàng bị các trang web nhận diện, do đó chỉ phù hợp cho các nhiệm vụ đơn giản: thu thập danh sách tin tuyển dụng không cần đăng nhập, thu thập dữ liệu công khai, kiểm tra trình thu thập trước khi chạy trên proxy residential.

Khi nào proxy datacenter hoạt động:

  • Thu thập khối lượng dữ liệu nhỏ (tối đa 500 tin tuyển dụng mỗi ngày)
  • Thu thập dữ liệu từ các trang web không có bảo vệ nghiêm ngặt (các trang tuyển dụng khu vực nhỏ)
  • Sử dụng API chính thức với luân chuyển IP để vượt qua giới hạn tốc độ
  • Thu thập RSS feed và file XML của tin tuyển dụng

Đối với hh.ru và Superjob, proxy datacenter sẽ hoạt động không ổn định: bạn sẽ nhận captcha sau 20-30 yêu cầu, và nhiều IP đã nằm trong danh sách đen của các trang này.

Proxy residential — lựa chọn tối ưu cho các trang tuyển dụng

Proxy residential sử dụng địa chỉ IP của người dùng gia đình thực tế, do đó các trang web coi chúng như khách truy cập thông thường. Đây là sự cân bằng tối ưu giữa giá cả và chất lượng để thu thập dữ liệu tuyển dụng.

Ưu điểm cho việc thu thập dữ liệu từ các trang tuyển dụng:

  • Rủi ro chặn thấp — hh.ru và Superjob không thể phân biệt IP residential với người dùng thực
  • Nhóm IP lớn — có thể cấu hình luân chuyển cho mỗi yêu cầu hoặc mỗi 5-10 phút
  • Gắn kết địa lý — có thể thu thập tin tuyển dụng từ thành phố cụ thể bằng cách sử dụng IP của khu vực đó
  • Ổn định — một IP residential có thể xử lý 200-500 yêu cầu mà không bị chặn

Để thu thập dữ liệu quy mô lớn (hơn 1000 tin tuyển dụng mỗi ngày), proxy residential với luân chuyển IP là giải pháp tiêu chuẩn. Bạn cấu hình thay đổi IP mỗi 5-10 phút, thêm độ trễ ngẫu nhiên giữa các yêu cầu (3-7 giây) và có được việc thu thập dữ liệu ổn định mà không bị chặn.

Proxy mobile cho LinkedIn và thu thập với đăng nhập

Proxy mobile sử dụng IP của các nhà mạng di động. Ưu điểm chính của chúng — một IP được sử dụng bởi hàng trăm người dùng thực đồng thời, do đó các trang web không thể chặn địa chỉ đó mà không có rủi ro chặn hàng nghìn khách truy cập thông thường.

Khi nào cần proxy mobile:

  • Thu thập dữ liệu từ LinkedIn — nền tảng này có bảo vệ nghiêm ngặt nhất chống bot và chặn mạnh mẽ IP datacenter và thậm chí cả residential
  • Làm việc với đăng nhập — nếu bạn cần thu thập tin tuyển dụng đóng hoặc dữ liệu hồ sơ, IP mobile giảm rủi ro bị cấm tài khoản
  • Thu thập từ các trang tuyển dụng nước ngoài — Indeed, Glassdoor, Monster sử dụng hệ thống bảo vệ tiên tiến, nơi IP mobile hoạt động đáng tin cậy hơn
  • Vượt qua chặn nghiêm ngặt — nếu proxy residential của bạn bắt đầu nhận captcha, chuyển sang mobile sẽ giải quyết vấn đề

Nhược điểm của proxy mobile — giá cao và tốc độ thấp hơn. Nhưng đối với các nhiệm vụ quan trọng, nơi việc chặn không thể chấp nhận được, đây là lựa chọn tốt nhất.

Đặc điểm thu thập dữ liệu từ hh.ru: bảo vệ và cách vượt qua

hh.ru — trang tuyển dụng lớn nhất Nga với bảo vệ tiên tiến nhất chống thu thập dữ liệu trong số các trang tuyển dụng nội địa. Trang web sử dụng kết hợp giới hạn tốc độ, fingerprinting và phân tích hành vi để phát hiện bot.

Cách hoạt động của bảo vệ hh.ru

1. Giới hạn theo địa chỉ IP: Sau 80-120 yêu cầu mỗi giờ từ một IP, trang web bắt đầu hiển thị captcha hoặc trả về HTTP 429 (Too Many Requests). Việc chặn kéo dài từ 1 đến 6 giờ tùy thuộc vào mức độ thu thập dữ liệu.

2. Kiểm tra User-Agent và tiêu đề: hh.ru phân tích tiêu đề yêu cầu HTTP. Nếu User-Agent không khớp với trình duyệt thực hoặc thiếu các tiêu đề chuẩn (Accept-Language, Accept-Encoding), yêu cầu bị chặn.

3. Kiểm tra JavaScript: Một số trang của hh.ru yêu cầu thực thi JavaScript để tải dữ liệu. Trình thu thập HTTP đơn giản không có headless browser sẽ không thể lấy nội dung đầy đủ.

4. Liên kết Honeypot: Trên các trang có các phần tử ẩn mà chỉ trình thu thập dữ liệu mới thấy. Nếu script của bạn truy cập các liên kết này — IP sẽ vào danh sách đen trong 24 giờ.

Chiến lược vượt qua bảo vệ hh.ru với proxy

Để thu thập dữ liệu ổn định từ hh.ru mà không bị chặn, sử dụng cấu hình sau:

Cấu hình tối ưu để thu thập dữ liệu từ hh.ru:

  • Loại proxy: Residential với luân chuyển IP mỗi 5-10 phút
  • Độ trễ giữa các yêu cầu: 4-8 giây (giá trị ngẫu nhiên)
  • User-Agent: Luân chuyển User-Agent thực của các trình duyệt hiện đại (Chrome, Firefox, Safari phiên bản mới nhất)
  • Tiêu đề: Bộ đầy đủ các tiêu đề trình duyệt chuẩn (Accept, Accept-Language, Accept-Encoding, Referer)
  • Cookies: Lưu và truyền cookies giữa các yêu cầu trong một phiên
  • Giới hạn yêu cầu: Không quá 60-80 yêu cầu trên một IP, sau đó thay đổi proxy

Ví dụ về chuỗi hành động an toàn:

  1. Kết nối với proxy residential có IP từ khu vực cần thiết (ví dụ: Moscow)
  2. Thực hiện yêu cầu đầu tiên đến trang chủ hh.ru, nhận và lưu cookies
  3. Đợi 5-7 giây (mô phỏng đọc trang)
  4. Thực hiện yêu cầu đến trang tìm kiếm tin tuyển dụng với các bộ lọc cần thiết
  5. Thu thập danh sách tin tuyển dụng (thường là 20-50 trên mỗi trang)
  6. Đối với mỗi tin tuyển dụng, thực hiện yêu cầu đến trang chi tiết với độ trễ 4-6 giây
  7. Sau 60-70 yêu cầu, thay đổi proxy và lặp lại chu trình

Với chiến lược này, bạn có thể thu thập 1000-2000 tin tuyển dụng mỗi ngày từ một luồng mà không bị chặn một lần nào. Nếu cần khối lượng lớn hơn — chạy nhiều luồng song song với các proxy khác nhau.

Lời khuyên: hh.ru cung cấp API miễn phí để truy cập tin tuyển dụng. Đối với hầu hết các nhiệm vụ (phân tích thị trường lao động, giám sát lương), API sẽ là giải pháp ổn định hơn so với thu thập HTML. Proxy có thể được sử dụng để luân chuyển IP khi làm việc với API, để vượt qua giới hạn tốc độ.

Thu thập dữ liệu từ Superjob, LinkedIn và các nền tảng nước ngoài

Superjob: đặc điểm bảo vệ

Superjob có bảo vệ ít nghiêm ngặt hơn so với hh.ru, nhưng vẫn tích cực chống lại việc thu thập dữ liệu. Các điểm khác biệt chính:

  • Giới hạn tốc độ thấp hơn: Chặn xảy ra sau 50-70 yêu cầu mỗi giờ (so với 80-120 của hh.ru)
  • Kiểm tra tiêu đề ít nghiêm ngặt hơn: Có thể sử dụng bộ tiêu đề đơn giản hóa
  • Không có bảo vệ JavaScript: Hầu hết dữ liệu có sẵn thông qua yêu cầu HTTP đơn giản không cần headless browser
  • Chặn theo khu vực: Một số tin tuyển dụng chỉ có sẵn với IP từ khu vực cụ thể

Đối với Superjob, proxy residential với luân chuyển mỗi 10-15 phút và độ trễ giữa các yêu cầu 3-5 giây là đủ. Điều này cho phép thu thập ổn định 500-1000 tin tuyển dụng mỗi ngày.

LinkedIn: bảo vệ nghiêm ngặt nhất

LinkedIn — đây là một câu chuyện riêng. Nền tảng sử dụng các thuật toán học máy tiên tiến để phát hiện bot và có một trong những hệ thống bảo vệ tích cực nhất trong số tất cả các mạng xã hội và trang tuyển dụng.

Đặc điểm bảo vệ của LinkedIn:

  • Đăng nhập bắt buộc: Hầu hết dữ liệu chỉ có sẵn cho người dùng đã đăng nhập
  • Phân tích hành vi: LinkedIn phân tích các mẫu hành động: tốc độ cuộn, chuyển động chuột, thời gian trên trang
  • Chặn tài khoản: Khi có hoạt động đáng ngờ, không chỉ IP mà cả tài khoản bị chặn
  • Giới hạn xem hồ sơ: Tài khoản miễn phí có thể xem số lượng hồ sơ hạn chế mỗi tháng
  • Thực thi JavaScript bắt buộc: Không có headless browser, việc thu thập dữ liệu là không thể

Chiến lược thu thập dữ liệu từ LinkedIn:

  1. Sử dụng proxy mobile — chúng cho rủi ro chặn thấp nhất. Một IP mobile có thể được sử dụng cho 100-200 lượt xem hồ sơ mỗi ngày.
  2. Headless browser bắt buộc — sử dụng Puppeteer hoặc Playwright với cấu hình fingerprint trình duyệt thực (độ phân giải màn hình, WebGL, Canvas).
  3. Tốc độ thu thập chậm — không quá 20-30 hồ sơ mỗi giờ từ một tài khoản. Thêm độ trễ 10-20 giây giữa các lượt xem.
  4. Mô phỏng hành vi thực — cuộn trang, nhấp chuột ngẫu nhiên, chuyển đổi giữa các phần của hồ sơ.
  5. Làm nóng tài khoản — tài khoản LinkedIn mới không thể được sử dụng ngay lập tức để thu thập dữ liệu. Cần 1-2 tuần để mô phỏng hoạt động của người dùng thông thường.
  6. Luân chuyển tài khoản — sử dụng nhiều tài khoản với các proxy khác nhau để phân phối tải.

Thu thập dữ liệu từ LinkedIn — đây là nhiệm vụ phức tạp nhất trong số tất cả các trang tuyển dụng. Nếu bạn cần dữ liệu từ nền tảng này, hãy xem xét sử dụng API Sales Navigator chính thức hoặc các dịch vụ bên thứ ba cung cấp dữ liệu hợp pháp.

Các trang tuyển dụng nước ngoài: Indeed, Glassdoor, Monster

Các nền tảng nước ngoài thường có bảo vệ nghiêm ngặt hơn so với các trang web Nga (ngoại trừ hh.ru). Các đặc điểm chính:

  • Indeed — sử dụng Cloudflare với kiểm tra JavaScript. Cần headless browser và proxy residential/mobile từ quốc gia có tin tuyển dụng bạn đang thu thập.
  • Glassdoor — yêu cầu đăng nhập để xem hầu hết dữ liệu. Chặn mạnh IP datacenter. Sử dụng proxy residential và tốc độ thu thập chậm (độ trễ 8-12 giây).
  • Monster — có API cho đối tác, nhưng để thu thập HTML cần proxy residential với gắn kết địa lý với quốc gia cần thiết.

Đối với tất cả các nền tảng nước ngoài, gắn kết địa lý của proxy là cực kỳ quan trọng. Nếu bạn thu thập tin tuyển dụng ở Mỹ, hãy sử dụng IP residential của Mỹ. Yêu cầu từ IP của các quốc gia khác có thể gây nghi ngờ và dẫn đến chặn.

Cấu hình luân chuyển IP và độ trễ giữa các yêu cầu

Cấu hình luân chuyển proxy đúng cách — đây là chìa khóa để thu thập dữ liệu ổn định mà không bị chặn. Hãy xem xét hai chiến lược chính: luân chuyển cho mỗi yêu cầu và luân chuyển theo thời gian.

Luân chuyển cho mỗi yêu cầu (Rotating Proxies)

Với phương pháp này, mỗi yêu cầu HTTP đi từ một địa chỉ IP mới. Đây là phương pháp an toàn nhất, nhưng có hạn chế:

Ưu điểm:

  • Không thể theo dõi hoạt động của một IP
  • Có thể thực hiện nhiều yêu cầu hơn trong một đơn vị thời gian
  • Không cần theo dõi giới hạn cho mỗi IP

Nhược điểm:

  • Không thể duy trì phiên (cookies bị mất khi thay đổi IP)
  • Không phù hợp cho thu thập với đăng nhập
  • Một số trang web chặn yêu cầu nếu IP thay đổi quá thường xuyên

Luân chuyển cho mỗi yêu cầu phù hợp để thu thập các trang công khai của hh.ru và Superjob không cần đăng nhập. Được cấu hình thông qua tham số của nhà cung cấp proxy (thường là endpoint đặc biệt với luân chuyển tự động).

Luân chuyển theo thời gian (Sticky Sessions)

Với phương pháp này, một IP được sử dụng trong một khoảng thời gian nhất định (5-30 phút), sau đó tự động thay đổi. Đây là lựa chọn tối ưu cho hầu hết các nhiệm vụ thu thập dữ liệu từ các trang tuyển dụng.

Khoảng thời gian luân chuyển được khuyến nghị:

Trang web Khoảng luân chuyển Yêu cầu tối đa trên IP Độ trễ giữa yêu cầu
hh.ru 5-10 phút 60-80 4-8 giây
Superjob 10-15 phút 50-70 3-5 giây
LinkedIn 30-60 phút 20-40 10-20 giây
Indeed 10-20 phút 40-60 5-10 giây
Glassdoor 15-30 phút 30-50 8-12 giây

Cấu hình độ trễ ngẫu nhiên

Độ trễ cố định giữa các yêu cầu (ví dụ: chính xác 5 giây) trông đáng ngờ đối với hệ thống bảo vệ. Người dùng thực không thể hành động với độ chính xác như vậy. Luôn sử dụng độ trễ ngẫu nhiên trong một phạm vi.

Ví dụ triển khai độ trễ ngẫu nhiên:

// Python
import time
import random

# Độ trễ từ 4 đến 8 giây
delay = random.uniform(4, 8)
time.sleep(delay)

# Logic phức tạp hơn: đôi khi tạo tạm dừng dài
if random.random() < 0.1:  # Xác suất 10%
    time.sleep(random.uniform(15, 30))  # Mô phỏng người dùng bị phân tâm
else:
    time.sleep(random.uniform(4, 8))
// JavaScript / Node.js
const sleep = (min, max) => {
  const delay = Math.random() * (max - min) + min;
  return new Promise(resolve => setTimeout(resolve, delay * 1000));
};

// Sử dụng
await sleep(4, 8);  // Độ trễ 4-8 giây

// Với xác suất tạm dừng dài
if (Math.random() < 0.1) {
  await sleep(15, 30);  // Xác suất 10% tạm dừng dài
} else {
  await sleep(4, 8);
}

Thêm các tạm dừng dài ngẫu nhiên (15-30 giây) với xác suất 5-10% làm cho hành vi của trình thu thập dữ liệu giống người dùng thực hơn, người có thể bị phân tâm bởi cuộc gọi điện thoại hoặc nhiệm vụ khác.

Xử lý captcha và các loại chặn khác

Ngay cả khi cấu hình proxy và độ trễ đúng cách, bạn có thể gặp captcha hoặc các loại chặn khác. Hãy xem xét cách phản ứng đúng với những tình huống này.

Các loại chặn của các trang tuyển dụng

1. HTTP 429 Too Many Requests — loại chặn phổ biến nhất. Trang web thông báo rõ ràng rằng bạn đã vượt quá giới hạn yêu cầu. Thường trong tiêu đề phản hồi có Retry-After, cho biết sau bao nhiêu giây có thể thử lại yêu cầu.

Cách xử lý: Ngay lập tức thay đổi proxy và thêm IP hiện tại vào danh sách đen trong thời gian được chỉ định trong Retry-After (thường là 1-6 giờ). Nếu không có Retry-After, thêm IP vào danh sách đen trong 2 giờ.

2. HTTP 403 Forbidden — IP bị chặn ở cấp máy chủ. Đây là chặn nghiêm trọng hơn, có thể kéo dài từ vài giờ đến cả ngày.

Cách xử lý: Thay đổi proxy và thêm IP vào danh sách đen dài hạn (24 giờ). Phân tích log: có thể bạn đang thu thập quá mạnh hoặc sử dụng IP datacenter nơi cần residential.

3. Captcha (CAPTCHA) — trang web hiển thị kiểm tra "tôi không phải robot". Điều này có nghĩa là hành vi của bạn có vẻ đáng ngờ, nhưng IP chưa bị chặn hoàn toàn.

Cách xử lý: Có ba lựa chọn:

  • Thay đổi proxy — cách đơn giản nhất. IP hiện tại được thêm vào danh sách đen trong 6-12 giờ.
  • Giải captcha tự động — sử dụng các dịch vụ như 2Captcha, Anti-Captcha, CapSolver. Chi phí $1-3 cho 1000 lần giải.
  • Giải thủ công — nếu việc thu thập không quan trọng về thời gian, có thể gửi captcha cho người vận hành giải thủ công.

4. Cloudflare Challenge — kiểm tra JavaScript yêu cầu thực thi mã trong trình duyệt. Thư viện HTTP thông thường sẽ không vượt qua kiểm tra này.

Cách xử lý: Sử dụng headless browser (Puppeteer, Playwright, Selenium) với cấu hình fingerprint thực. Các thư viện như puppeteer-extra-plugin-stealth giúp vượt qua phát hiện chế độ headless.

Tích hợp dịch vụ giải captcha

Nếu bạn quyết định giải captcha tự động, đây là ví dụ tích hợp với dịch vụ phổ biến 2Captcha:

// Python với thư viện 2captcha-python
from twocaptcha import TwoCaptcha
import requests

solver = TwoCaptcha('YOUR_API_KEY')

try:
    # Giải reCAPTCHA v2
    result = solver.recaptcha(
        sitekey='6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
        url='https://hh.ru/search/vacancy',
        proxy={
            'type': 'HTTPS',
            'uri': 'login:password@ip:port'
        }
    )
    
    # Nhận token giải pháp
    captcha_token = result['code']
    
    # Gửi yêu cầu với token
    response = requests.post(
        'https://hh.ru/search/vacancy',
        data={
            'g-recaptcha-response': captcha_token,
            # các tham số form khác
        },
        proxies={
            'http': 'http://login:password@ip:port',
            'https': 'http://login:password@ip:port'
        }
    )
    
except Exception as e:
    print(f'Lỗi giải captcha: {e}')

Giải một captcha mất 10-30 giây và có giá khoảng $0.001-0.003. Đối với thu thập dữ liệu quy mô lớn, điều này có thể đắt, do đó tốt hơn là cấu hình thu thập sao cho captcha xuất hiện ít nhất có thể.

Hệ thống giám sát và cảnh báo

Để trình thu thập hoạt động ổn định, quan trọng là cấu hình giám sát chặn và cảnh báo tự động:

Những gì cần theo dõi:

  • Tỷ lệ yêu cầu thành công — nếu giảm xuống dưới 90%, cần kiểm tra proxy và cài đặt
  • Số lượng captcha mỗi giờ — nếu nhiều hơn 5-10, bạn đang thu thập quá mạnh
  • Tốc độ phản hồi trung bình của proxy — nếu tăng đột ngột, có thể proxy bị quá tải
  • Số lượng lỗi 429/403 — chỉ báo chất lượng proxy và tính đúng đắn của cài đặt
  • Danh sách IP bị chặn — nếu cùng một IP bị chặn liên tục, loại bỏ nó khỏi nhóm

Cấu hình gửi thông báo (Telegram, email, Slack) nếu tỷ lệ yêu cầu thành công giảm xuống dưới giá trị ngưỡng. Điều này cho phép phản ứng nhanh với vấn đề và không mất thời gian thu thập.

Cấu hình proxy trong các công cụ thu thập dữ liệu phổ biến

Hãy xem xét cách cấu hình proxy trong các công cụ phổ biến nhất để thu thập dữ liệu từ các trang tuyển dụng: Python (requests, Scrapy), Node.js (axios, Puppeteer) và các giải pháp sẵn có.

Python: requests và Scrapy

Python — ngôn ngữ phổ biến nhất để thu thập dữ liệu nhờ các thư viện requests, BeautifulSoup và Scrapy.

Ví dụ với thư viện requests:

import requests
import random
import time

# Danh sách proxy (nhận từ nhà cung cấp)
PROXIES = [
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080'
]

# Danh sách User-Agent để luân chuyển
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]

def parse_vacancy(url):
    proxy = random.choice(PROXIES)
    user_agent = random.choice(USER_AGENTS)
    
    headers = {
        'User-Agent': user_agent,
        'Accept': 'text/html,application/xhtml+xml',
        'Accept-Language': 'ru-RU,ru;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive'
    }
    
    proxies = {
        'http': proxy,
        'https': proxy
    }
    
    try:
        response = requests.get(
            url,
            headers=headers,
            proxies=proxies,
            timeout=30
        )
        
        if response.status_code == 200:
            return response.text
        elif response.status_code == 429:
            print(f'Giới hạn tốc độ cho {proxy}, đổi proxy')
            # Xóa proxy khỏi danh sách tạm thời
            return None
        else:
            print(f'Lỗi {response.status_code}')
            return None
            
    except Exception as e:
        print(f'Lỗi yêu cầu: {e}')
        return None

# Sử dụng
for i in range(100):
    html = parse_vacancy('https://hh.ru/vacancy/123456')
    if html:
        # Xử lý dữ liệu
        pass
    
    # Độ trễ ngẫu nhiên
    time.sleep(random.uniform(4, 8))

Ví dụ cấu hình Scrapy:

# settings.py

# Bật hỗ trợ proxy
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
    'scrapy_rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'scrapy_rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}

# Danh sách proxy
ROTATING_PROXY_LIST = [
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080'
]

# Phát hiện cấm tự động
ROTATING_PROXY_BAN_POLICY = 'scrapy_rotating_proxies.policy.BanDetectionPolicy'

# Độ trễ giữa các yêu cầu
DOWNLOAD_DELAY = 5
RANDOMIZE_DOWNLOAD_DELAY = True  # Độ trễ ngẫu nhiên ±50%

# Luân chuyển User-Agent
DOWNLOADER_MIDDLEWARES.update({
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
})

# Tối đa yêu cầu đồng thời
CONCURRENT_REQUESTS = 4
CONCURRENT_REQUESTS_PER_DOMAIN = 1

Node.js: Puppeteer với proxy

Để thu thập dữ liệu từ các trang web có JavaScript (LinkedIn, Indeed) cần headless browser. Puppeteer — giải pháp phổ biến nhất cho Node.js.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// Plugin để vượt qua phát hiện headless browser
puppeteer.use(StealthPlugin());

async function parseWithProxy() {
  const proxy = 'http://user:[email protected]:8080';
  
  const browser = await puppeteer.launch({
    headless: true,
    args: [
      `--proxy-server=${proxy}`,
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-blink-features=AutomationControlled'
    ]
  });
  
  const page = await browser.newPage();
  
  // Đặt User-Agent thực
  await page.setUserAgent(
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
  );
  
  // Tiếp tục cấu hình...
}

Kết luận và khuyến nghị

Thu thập dữ liệu từ các trang tuyển dụng yêu cầu cách tiếp cận cẩn thận và cấu hình đúng đắn. Các điểm chính cần nhớ:

  • Sử dụng proxy residential cho hầu hết các nhiệm vụ — chúng cung cấp sự cân bằng tốt nhất giữa giá cả và độ tin cậy
  • Cấu hình luân chuyển IP và độ trễ ngẫu nhiên giữa các yêu cầu
  • Giám sát tỷ lệ yêu cầu thành công và phản ứng nhanh với vấn đề
  • Xem xét sử dụng API chính thức nếu có — chúng thường ổn định và hợp pháp hơn
  • Đối với LinkedIn và các nền tảng có bảo vệ nghiêm ngặt, sử dụng proxy mobile và headless browser

Với cấu hình đúng, bạn có thể thu thập hàng nghìn tin tuyển dụng mỗi ngày mà không bị chặn, cung cấp dữ liệu có giá trị cho phân tích HR và tự động hóa tuyển dụng.