Sử dụng Proxy training AI thu thập dữ liệu lớn không bị chặn
Proxy training AI là cách giúp anh em thu thập dữ liệu lớn ổn định hơn khi xây dựng mô hình AI. Trong bài viết này, ProxyVN sẽ cùng anh em đi từ nền tảng dễ hiểu đến cách chọn proxy, xoay vòng IP, xử lý chống bot, thiết kế hạ tầng và tối ưu chi phí. Mục tiêu là giúp quá trình crawl dữ liệu mượt hơn, ít lỗi hơn và dễ mở rộng hơn.
Proxy training AI quan trọng thế nào khi thu thập dữ liệu lớn
Đào tạo AI cần một lượng dữ liệu rất lớn. Với mô hình ngôn ngữ, dữ liệu có thể là bài viết, diễn đàn, tài liệu, mô tả sản phẩm hoặc nội dung mạng xã hội. Với mô hình thị giác máy tính, dữ liệu lại là hình ảnh, video hoặc metadata đi kèm.

Training AI với proxy
Các kho dữ liệu mở như Common Crawl cho thấy web công khai là nguồn dữ liệu khổng lồ cho nghiên cứu và mô hình AI. Tuy nhiên, khi anh em tự thu thập dữ liệu, vấn đề không chỉ là “lấy được bao nhiêu”. Vấn đề lớn hơn là lấy ổn định, không bị chặn IP, không bị ngắt phiên và không lãng phí tài nguyên.
Nếu gửi quá nhiều request từ một IP, website rất dễ xem đó là hành vi bất thường. Khi đó, anh em có thể gặp lỗi 403, 429, CAPTCHA, giới hạn tốc độ hoặc chặn truy cập theo vùng.
Các nguyên nhân thường gặp gồm:
-
Rate limit: Website giới hạn số request từ một IP trong một khoảng thời gian.
-
Hệ thống chống bot: Cloudflare, Akamai hoặc các WAF khác kiểm tra hành vi truy cập.
-
Giới hạn địa lý: Một số nội dung chỉ hiển thị ở quốc gia nhất định.
-
Bảo vệ dữ liệu cạnh tranh: Sàn thương mại điện tử, trang giá, trang review thường kiểm soát crawl rất chặt.
Lúc này, proxy giúp phân bổ request qua nhiều IP khác nhau. Thay vì 1 IP gửi 1.000 request, hệ thống có thể chia thành 1-2 request trên nhiều IP. Cách này giúp hành vi truy cập tự nhiên hơn và giảm rủi ro bị chặn.
Proxy không thay thế quy trình crawl có trách nhiệm. Anh em vẫn cần tôn trọng robots.txt, điều khoản sử dụng của website và chỉ thu thập dữ liệu ở phạm vi được phép.
Kết luận phần này rất đơn giản: muốn làm dữ liệu AI lâu dài, anh em cần xem proxy là một phần của hạ tầng, không phải chỉ là công cụ đổi IP.
Chọn loại Proxy training AI phù hợp với từng nhiệm vụ
Không phải dữ liệu nào cũng cần cùng một loại proxy. Nếu chọn proxy quá mạnh, chi phí sẽ đội lên. Nếu chọn proxy quá yếu, tỷ lệ lỗi sẽ cao và cuối cùng vẫn tốn tiền vì phải chạy lại nhiều lần.
Dưới đây là cách ProxyVN thường phân loại cho anh em dễ hình dung.
|
Loại proxy |
Tốc độ tham khảo |
Độ tin cậy với website |
Chi phí tham khảo |
Nên dùng khi nào |
|
Datacenter Proxy |
100-1000 Mbit/s |
Thấp đến trung bình |
$0.5-2/IP |
API mở, website tĩnh, nguồn ít bảo vệ |
|
Residential Proxy |
10-50 Mbit/s |
Cao |
$5-15/GB |
Mạng xã hội, thương mại điện tử, website có Cloudflare |
|
Mobile Proxy |
5-30 Mbit/s |
Rất cao |
$10-30/GB |
Ứng dụng mobile, kiểm thử môi trường 4G/5G |
Datacenter proxy cho nguồn dữ liệu dễ thu thập
Datacenter proxy là IP đến từ máy chủ, trung tâm dữ liệu hoặc nhà cung cấp cloud. Ưu điểm lớn nhất là tốc độ nhanh, chi phí dễ kiểm soát và phù hợp với khối lượng lớn.

Datacenter Proxy
Loại này nên dùng cho:
-
API mở.
-
Website tĩnh, ít kiểm tra fingerprint.
-
Kho tài liệu công khai.
-
Trang tin tức không có lớp bảo vệ mạnh.
-
Dữ liệu nội bộ hoặc nguồn đã được cấp quyền truy cập.
Nếu website không yêu cầu JavaScript rendering và không kiểm tra hành vi trình duyệt quá sâu, datacenter proxy thường là lựa chọn hợp lý.
Tuy nhiên, điểm yếu là một số website có thể nhận diện dải IP datacenter. Với mạng xã hội, sàn thương mại điện tử hoặc các trang có WAF mạnh, datacenter proxy dễ bị giới hạn hơn.
Residential proxy cho nguồn dữ liệu có bảo vệ
Residential proxy sử dụng IP giống người dùng dân cư. Vì vậy, request trông tự nhiên hơn so với IP máy chủ.

Residential Proxy
Loại này phù hợp khi anh em crawl dữ liệu từ:
-
Mạng xã hội.
-
Website có Cloudflare hoặc WAF.
-
Sàn thương mại điện tử.
-
Trang review, giá bán, listing sản phẩm.
-
Nội dung bị giới hạn theo quốc gia.
Ví dụ, Cloudflare Bot Management được thiết kế để nhận diện lưu lượng tự động và hỗ trợ website xử lý bot. Vì vậy, nếu anh em crawl nguồn có hệ thống bảo vệ mạnh, chỉ đổi User-Agent là chưa đủ. Proxy, tốc độ request, fingerprint trình duyệt và logic phiên đều cần được thiết kế kỹ.
Điểm cần lưu ý là residential proxy thường tính theo GB. Nếu tải cả hình ảnh, CSS, font và video qua proxy, chi phí sẽ tăng rất nhanh.
Mobile proxy cho môi trường đặc thù
Mobile proxy dùng IP từ nhà mạng di động 4G/5G. Loại này thường dùng khi anh em cần kiểm thử ứng dụng mobile hoặc website hiển thị nội dung khác nhau giữa desktop và mobile.
Với phần lớn bài toán training AI trên web, mobile proxy không phải lựa chọn đầu tiên. Anh em chỉ nên dùng khi nguồn dữ liệu yêu cầu môi trường di động thật sự.
Kết luận phần chọn proxy: hãy chọn theo độ khó của nguồn dữ liệu, không chọn theo cảm tính.
Ứng dụng Proxy training AI theo từng loại dữ liệu
Dữ liệu cho AI không chỉ có một dạng. Mỗi loại dữ liệu có yêu cầu proxy khác nhau. Vì vậy, trước khi crawl, anh em nên chia nguồn thành từng nhóm rõ ràng.
Dữ liệu văn bản cho NLP
Dữ liệu văn bản thường dùng cho mô hình ngôn ngữ, chatbot, phân loại nội dung, tìm kiếm ngữ nghĩa hoặc hệ thống RAG.

Dữ liệu văn bản cho NLP
Nguồn dữ liệu có thể gồm:
-
Blog.
-
Báo điện tử.
-
Diễn đàn.
-
Tài liệu kỹ thuật.
-
Trang hỏi đáp.
-
Mô tả sản phẩm.
-
Nội dung công khai trên web.
Với website tĩnh, anh em có thể dùng HTTP client như requests hoặc axios. Với website render bằng JavaScript, anh em nên dùng browser automation như Playwright hoặc Puppeteer.
Điểm quan trọng là giữ được cấu trúc dữ liệu. Khi lấy bài viết, anh em không chỉ cần nội dung chính, mà còn cần tiêu đề, heading, ngày đăng, tác giả, URL nguồn và metadata liên quan.
Dữ liệu hình ảnh cho computer vision
Dữ liệu hình ảnh thường nặng hơn văn bản rất nhiều. Một ảnh trung bình có thể vài trăm KB, thậm chí vài MB. Nếu anh em tải toàn bộ hình qua residential proxy, chi phí có thể tăng mạnh.
Cách tối ưu hơn là:
-
Bước 1: Dùng proxy để lấy danh sách URL hình ảnh.
-
Bước 2: Lọc ảnh theo định dạng, kích thước, chủ đề.
-
Bước 3: Chỉ tải ảnh đạt tiêu chí.
-
Bước 4: Nếu CDN cho phép, tải file trực tiếp hoặc dùng datacenter proxy để giảm chi phí.
Cách làm này giúp anh em giảm dữ liệu rác và tiết kiệm dung lượng.
Dữ liệu thương mại điện tử
Dữ liệu thương mại điện tử thường gồm tên sản phẩm, giá bán, đánh giá, tồn kho, hình ảnh, mô tả và thuộc tính sản phẩm.
Đây là nhóm dữ liệu có giá trị cao, nên nhiều website bảo vệ khá chặt. Với nhóm này, anh em nên dùng residential proxy, phiên cố định và tốc độ request vừa phải.
Đừng chỉ quan tâm tốc độ. Nếu crawl quá nhanh, hệ thống có thể trả dữ liệu lỗi, dữ liệu thiếu hoặc chặn IP. Khi đó, anh em phải chạy lại và tổng chi phí còn cao hơn.
Dữ liệu video và âm thanh
Video và âm thanh rất tốn dung lượng. Một video có thể vài chục đến vài trăm MB. Vì vậy, không nên tải toàn bộ video qua residential proxy nếu không cần thiết.
Cách hợp lý hơn là dùng proxy để lấy metadata, URL, tiêu đề, mô tả, thời lượng hoặc transcript nếu được phép. Sau đó, anh em chỉ tải file khi thật sự cần cho bài toán huấn luyện.
Kết luận phần này: mỗi loại dữ liệu cần một chiến lược riêng. Crawl càng lớn, phân loại càng quan trọng.
Chiến lược xoay vòng IP trong Proxy training AI
Xoay vòng IP là yếu tố quyết định độ ổn định khi thu thập dữ liệu lớn. Nhưng xoay vòng không có nghĩa là đổi IP càng nhiều càng tốt.

Proxy xoay vòng IP
Nếu đổi IP liên tục trong một phiên cần giữ cookie, website có thể thấy hành vi bất thường. Ngược lại, nếu giữ một IP quá lâu trong tác vụ khối lượng lớn, IP đó dễ bị giới hạn.
Xoay vòng theo từng request
Cách này nghĩa là mỗi request đi qua một IP mới. Nó phù hợp với các URL độc lập, không cần đăng nhập, không cần giữ cookie và không cần đi theo hành trình nhiều bước.
Ví dụ, anh em có 10.000 URL bài viết từ nhiều website khác nhau. Mỗi URL chỉ cần truy cập một lần để lấy HTML. Khi đó, xoay vòng theo request là lựa chọn dễ triển khai.
import requests
# Proxy xoay vòng: mỗi request có thể đi qua một IP khác nhau
proxies = {
'http': 'http://username:[email protected]:12345',
'https': 'http://username:[email protected]:12345'
}
urls = [
'https://site1.com/article-1',
'https://site2.com/article-2',
'https://site3.com/article-3'
]
for url in urls:
response = requests.get(url, proxies=proxies, timeout=30)
# parse_data là hàm anh em tự viết để xử lý HTML
parse_data(response.text)
Đoạn code trên có 3 ý chính:
-
proxieslà cấu hình proxy cho cảHTTPvàHTTPS. -
requests.get()gửi request qua proxy đã khai báo. -
parse_data()là nơi anh em trích xuất nội dung cần lấy.
Ưu điểm của cách này là đơn giản, dễ mở rộng và giảm tải cho từng IP. Nhược điểm là không phù hợp với website cần giữ phiên đăng nhập hoặc cookie.
Xoay vòng theo thời gian với phiên cố định
Phiên cố định phù hợp khi anh em cần đi qua nhiều trang liên tiếp trên cùng một website. Ví dụ, crawl danh mục sản phẩm từ trang 1 đến trang 100.
Trong trường hợp này, giữ cùng một IP trong 5-30 phút sẽ tự nhiên hơn. Website sẽ thấy giống một người dùng đang xem nhiều trang trong cùng một phiên.
import requests
import time
import random
import string
def generate_random_string(length=8):
return ''.join(random.choice(string.ascii_lowercase) for _ in range(length))
# Tạo session ID để giữ IP trong một khoảng thời gian
session_id = generate_random_string()
proxies = {
'http': f'http://username-session-{session_id}:[email protected]:12345',
'https': f'http://username-session-{session_id}:[email protected]:12345'
}
for page in range(1, 101):
url = f'https://site.com/catalog?page={page}'
response = requests.get(url, proxies=proxies, timeout=30)
parse_page(response.text)
# Nghỉ 2 giây để tránh gửi request quá dày
time.sleep(2)
Đoạn code này dễ hiểu như sau:
-
session_idgiúp hệ thống proxy nhận diện phiên. -
Các
requesttrong cùng phiên sẽ dùng cùng một IP. -
time.sleep(2)tạo khoảng nghỉ giữa các request.
Nếu website giới hạn khoảng 60 request/phút, anh em không nên gửi sát giới hạn. Hãy giữ tốc độ thấp hơn để giảm lỗi. Ví dụ, chỉ chạy 20-40 request/phút trên mỗi IP.
Pool IP tĩnh cho hệ thống lớn
Pool IP tĩnh phù hợp khi anh em có danh sách 100-1.000 IP và muốn tự kiểm soát phân phối request.
Cách này hữu ích khi cần:
-
Chia domain theo từng nhóm IP.
-
Theo dõi IP nào lỗi nhiều.
-
Tạm ngưng IP bị giới hạn.
-
Cân bằng tải giữa nhiều worker.
import requests
from itertools import cycle
# Danh sách proxy tĩnh
ip_pool = [
'http://user:[email protected]:12345',
'http://user:[email protected]:12345',
'http://user:[email protected]:12345',
]
# cycle giúp xoay vòng qua từng proxy
proxy_cycle = cycle(ip_pool)
for url in urls:
proxy = next(proxy_cycle)
try:
response = requests.get(
url,
proxies={'http': proxy, 'https': proxy},
timeout=30
)
parse_data(response.text)
except Exception as e:
log_error(url, proxy, str(e))
Trong đoạn này, cycle(ip_pool) giúp lấy lần lượt từng proxy. Khi đi hết danh sách, nó quay lại từ đầu.
Điểm mạnh là dễ kiểm soát. Điểm yếu là anh em cần viết thêm logic để loại IP lỗi, ghi log và retry.
Kết luận phần xoay vòng: IP rotation phải đi cùng logic crawl. Không nên xoay bừa, cũng không nên giữ IP quá lâu nếu khối lượng request lớn.
Giảm lỗi chống bot khi dùng Proxy training AI
Proxy giúp giảm rủi ro chặn IP, nhưng không giải quyết mọi vấn đề. Website hiện đại có thể kiểm tra nhiều tín hiệu khác nhau để nhận diện bot.

Lỗi chống bot khi dùng proxy
Các tín hiệu thường được kiểm tra gồm:
-
User-Agent: Trình duyệt nào đang truy cập. -
Headers: Accept, Accept-Language, Referer, Encoding. -
TLS fingerprint: Dấu hiệu từ kết nối SSL. -
JavaScript fingerprint:Canvas, WebGL, AudioContext, font, plugin. -
Hành vi: Tốc độ cuộn, click, thời gian ở lại trang.
-
Mẫu
request: Truy cập quá nhanh, quá đều, quá giống nhau.
Vì vậy, với website JavaScript hoặc nguồn có cơ chế bảo vệ mạnh, anh em nên dùng browser automation thay vì chỉ dùng HTTP client.
Dùng Puppeteer cho website cần render JavaScript
Puppeteer giúp điều khiển trình duyệt bằng code. Nó phù hợp khi trang cần load JavaScript rồi mới hiển thị dữ liệu.
Lưu ý quan trọng: đoạn code dưới đây nên dùng cho website anh em sở hữu, môi trường kiểm thử hoặc nguồn dữ liệu đã được phép truy cập. Không nên dùng để vượt qua lớp bảo vệ trái phép.
// Puppeteer với plugin hỗ trợ môi trường browser automation tự nhiên hơn
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
(async () => {
const browser = await puppeteer.launch({
headless: true,
args: [
'--proxy-server=http://username:[email protected]:12345',
'--disable-blink-features=AutomationControlled'
]
});
const page = await browser.newPage();
// Thiết lập viewport giống người dùng desktop phổ biến
await page.setViewport({
width: 1920,
height: 1080
});
// Mở trang cần thu thập dữ liệu
await page.goto('https://example.com/data-page', {
waitUntil: 'networkidle2'
});
// Tạo độ trễ nhẹ để trang tải ổn định hơn
await page.waitForTimeout(2000 + Math.random() * 3000);
// Lấy dữ liệu từ phần tử trên trang
const data = await page.evaluate(() => {
const element = document.querySelector('.data');
return element ? element.innerText : null;
});
console.log(data);
await browser.close();
})();
Giải thích dễ hiểu:
-
puppeteer-extragiúp mở rộng Puppeteer bằng plugin. -
StealthPlugin()làm môi trường automation ít “cứng” hơn. -
--proxy-serverkhai báo proxy cho trình duyệt. -
page.setViewport()đặt kích thước màn hình. -
page.goto()mở website. -
page.evaluate()chạy JavaScript trong trang để lấy dữ liệu.
Nếu website không cần JavaScript, anh em không cần dùng Puppeteer. Dùng trình duyệt thật cho mọi thứ sẽ tốn CPU, RAM và chi phí server.
Dùng Playwright cho nhiều trình duyệt
Playwright hỗ trợ Chromium, Firefox và WebKit. Nó phù hợp khi anh em muốn kiểm tra dữ liệu trên nhiều môi trường trình duyệt.
Playwright cũng hữu ích khi website có nhiều thao tác như click, cuộn, chọn bộ lọc hoặc chờ phần tử xuất hiện.
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: true,
proxy: {
server: 'http://residential.proxy.example:12345',
username: 'username',
password: 'password'
}
});
const page = await browser.newPage({
viewport: {
width: 1366,
height: 768
}
});
await page.goto('https://example.com/catalog', {
waitUntil: 'domcontentloaded'
});
await page.waitForSelector('.item');
const items = await page.$$eval('.item', elements => {
return elements.map(item => ({
title: item.querySelector('h2')?.innerText || '',
price: item.querySelector('.price')?.innerText || ''
}));
});
console.log(items);
await browser.close();
})();
Trong đoạn này:
-
chromium.launch()mở trình duyệt Chromium. -
proxykhai báoserver, usernamevàpassword. -
waitForSelector('.item')chờ dữ liệu xuất hiện. -
$$eval()lấy nhiều phần tử cùng lúc.
Khi crawl ở quy mô lớn, anh em nên giới hạn số browser chạy đồng thời. Nếu mở quá nhiều browser, server sẽ nghẽn trước khi proxy bị nghẽn.
Kiến trúc hạ tầng Proxy training AI cho dự án lớn
Khi dữ liệu tăng lên hàng triệu URL, một file script chạy trên một máy sẽ không còn phù hợp. Anh em cần một kiến trúc có thể mở rộng.

Hạ tầng Proxy training AI
Một hệ thống cơ bản nên có 4 phần.
Hàng đợi tác vụ
Hàng đợi lưu danh sách URL cần crawl. Các công cụ thường dùng gồm Redis, RabbitMQ hoặc AWS SQS.
Hàng đợi giúp worker lấy từng URL ra xử lý. Nếu worker bị lỗi, URL có thể được đưa lại vào hàng đợi để chạy lại.
Worker xử lý dữ liệu
Worker là tiến trình lấy URL từ hàng đợi, chọn proxy, gửi request, parse dữ liệu và lưu kết quả.
Một hệ thống có thể chạy 10, 50 hoặc 100 worker song song. Mỗi worker có thể dùng một proxy riêng hoặc dùng chung pool proxy.
Kho lưu trữ
Dữ liệu sau khi crawl cần được lưu đúng chỗ.
-
Văn bản thô:
S3, MinIOhoặcstoragedạngobject. -
Dữ liệu có cấu trúc:
PostgreSQL, MySQLhoặcMongoDB. -
Log crawl:
Elasticsearch, Lokihoặcfile log. -
Dữ liệu lớn:
data laketrênS3hoặcGoogle Cloud Storage.
Giám sát hệ thống
Giám sát giúp anh em biết hệ thống đang khỏe hay đang lỗi.
Các chỉ số cần theo dõi gồm:
-
Tỷ lệ request thành công.
-
Tỷ lệ lỗi 403, 429, 500.
-
Số URL xử lý mỗi phút.
-
Dung lượng proxy đã dùng.
-
Chi phí trên 1.000 bản ghi.
-
Tỷ lệ dữ liệu trùng lặp.
Nếu tỷ lệ lỗi tăng đột ngột, anh em cần giảm tốc độ, đổi loại proxy hoặc kiểm tra lại logic crawl.
Ví dụ worker Python với Redis
Dưới đây là ví dụ worker đơn giản. Nó lấy URL từ Redis, chọn proxy, gửi request, parse dữ liệu và lưu kết quả.
# worker.py - tiến trình xử lý crawl dữ liệu
import redis
import requests
import json
from datetime import datetime
# Kết nối Redis để lấy hàng đợi tác vụ
queue = redis.Redis(host='redis-server', port=6379)
# Hàm giả định: load danh sách proxy từ file config hoặc database
proxies_pool = load_proxies_from_config()
while True:
# Lấy một URL từ hàng đợi parsing_queue
task = queue.blpop('parsing_queue', timeout=5)
if not task:
continue
url = task[1].decode('utf-8')
proxy = get_next_proxy(proxies_pool)
try:
response = requests.get(
url,
proxies={
'http': proxy,
'https': proxy
},
timeout=30,
headers={
'User-Agent': get_random_user_agent()
}
)
# Phân tích HTML để lấy dữ liệu cần thiết
data = parse_html(response.text)
# Lưu dữ liệu vào storage
file_path = f'data/{datetime.now().isoformat()}/{hash(url)}.json'
save_to_s3(data, file_path)
# Ghi log thành công
log_success(url, proxy)
except Exception as e:
# Nếu lỗi, đưa URL trở lại hàng đợi để retry
queue.rpush('parsing_queue', url)
# Ghi log lỗi và đánh dấu proxy có vấn đề
log_error(url, proxy, str(e))
mark_proxy_as_failed(proxy)
Giải thích từng phần:
-
queue.blpop()lấy URL từ Redis theo cơ chế chờ. -
get_next_proxy()chọn proxy tiếp theo trong pool. -
requests.get()gửi request qua proxy. -
parse_html()xử lý HTML và trích dữ liệu. -
save_to_s3()lưu kết quả. -
Nếu lỗi, URL được đưa lại vào hàng đợi để xử lý sau.
Điểm hay của kiến trúc này là dễ mở rộng. Muốn nhanh hơn, anh em chỉ cần thêm worker hoặc thêm server.
Công cụ tự động hóa cho Proxy training AI
Tự viết crawler từ đầu giúp linh hoạt, nhưng không phải lúc nào cũng hiệu quả. Với dự án lớn, anh em nên dùng framework chuyên biệt để tiết kiệm thời gian.
Scrapy cho Python
Scrapy là framework phổ biến cho web crawling và web scraping bằng Python. Nó hỗ trợ request song song, middleware, retry, pipeline và xuất dữ liệu ra JSON, CSV hoặc database.
Ví dụ cấu hình Scrapy với proxy xoay vòng:
# settings.py - cấu hình Scrapy với danh sách proxy
ROTATING_PROXY_LIST = [
'http://user:[email protected]:12345',
'http://user:[email protected]:12345',
'http://user:[email protected]:12345',
]
DOWNLOADER_MIDDLEWARES = {
'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}
# Số request chạy đồng thời
CONCURRENT_REQUESTS = 100
# Độ trễ giữa các request
DOWNLOAD_DELAY = 0.5
Giải thích dễ hiểu:
-
ROTATING_PROXY_LISTlà danh sách proxy. -
RotatingProxyMiddlewaretự đổi proxy giữa các request. -
BanDetectionMiddlewarehỗ trợ phát hiện proxy bị chặn. -
CONCURRENT_REQUESTSkiểm soát độ song song. -
DOWNLOAD_DELAYgiúp request không bị dồn quá dày.
Scrapy phù hợp với website tĩnh. Nếu website render nhiều bằng JavaScript, anh em nên kết hợp Scrapy với trình duyệt headless hoặc chuyển sang Playwright.
Crawlee cho Node.js
Crawlee phù hợp với anh em làm JavaScript hoặc Node.js. Nó hỗ trợ HTTP crawler, Puppeteer crawler, Playwright crawler và quản lý proxy khá tiện.
Ví dụ dùng Crawlee với PlaywrightCrawler:
import { PlaywrightCrawler, ProxyConfiguration } from 'crawlee';
const proxyConfiguration = new ProxyConfiguration({
proxyUrls: [
'http://user:[email protected]:12345',
'http://user:[email protected]:12345',
],
});
const crawler = new PlaywrightCrawler({
proxyConfiguration,
// Giới hạn số page chạy đồng thời
maxConcurrency: 50,
requestHandler: async ({ page, request }) => {
await page.waitForSelector('.data');
const data = await page.$$eval('.item', items =>
items.map(item => ({
title: item.querySelector('h2')?.innerText || '',
price: item.querySelector('.price')?.innerText || ''
}))
);
await saveData({
url: request.url,
data
});
},
});
await crawler.run([
'https://example.com/catalog'
]);
Đoạn này có 4 điểm chính:
-
ProxyConfiguration quản lý danh sách proxy.
-
PlaywrightCrawler dùng trình duyệt để load trang.
-
maxConcurrency giới hạn số tác vụ chạy cùng lúc.
-
requestHandler là nơi lấy dữ liệu từ từng trang.
Crawlee tiện ở chỗ tích hợp tốt với browser automation, phù hợp với website động.
Apache Nutch cho crawling quy mô lớn
Apache Nutch là crawler mã nguồn mở có khả năng mở rộng cao. Nó phù hợp với các bài toán crawl rất lớn, kiểu thu thập dữ liệu trên nhiều domain và nhiều lớp liên kết.
Nutch khó cài hơn Scrapy hoặc Crawlee. Tuy nhiên, khi anh em cần crawling quy mô lớn, có chính sách crawl rõ ràng, hỗ trợ sitemap, robots.txt và xử lý dữ liệu phân tán, Nutch là lựa chọn đáng cân nhắc.
Với đội nhỏ hoặc dự án mới, ProxyVN khuyên anh em nên bắt đầu từ Scrapy hoặc Crawlee trước. Khi quy mô đủ lớn, hãy tính đến Nutch.
Tối ưu tốc độ và chi phí khi dùng Proxy training AI
Chi phí proxy thường tăng không phải vì proxy đắt, mà vì hệ thống crawl chưa tối ưu. Có 4 điểm anh em nên kiểm soát từ đầu.
Kết hợp nhiều loại proxy
Đừng dùng residential proxy cho mọi nguồn. Hãy chia nguồn dữ liệu theo độ khó.
-
Nguồn không có bảo vệ: dùng datacenter proxy.
-
Nguồn bảo vệ trung bình: dùng residential rotating.
-
Nguồn cần giữ phiên: dùng residential sticky session.
-
Nguồn mobile thật sự: mới dùng mobile proxy.
Ví dụ, anh em crawl 100 website. Nếu 70 website không có bảo vệ mạnh, hãy dùng datacenter cho nhóm đó. Chỉ dùng residential cho 30 website khó hơn. Cách chia này giúp giảm chi phí đáng kể.
Cache dữ liệu đã lấy
Nếu một URL đã crawl hôm nay và nội dung ít thay đổi, anh em không nên tải lại liên tục. Cache giúp tiết kiệm request, tiết kiệm proxy và giảm tải hệ thống.
import hashlib
import redis
import requests
cache = redis.Redis(host='localhost', port=6379)
def fetch_with_cache(url, proxies):
# Tạo key cache từ URL
cache_key = hashlib.md5(url.encode()).hexdigest()
# Kiểm tra URL đã có trong cache chưa
cached = cache.get(cache_key)
if cached:
return cached.decode('utf-8')
# Nếu chưa có cache, gửi request mới
response = requests.get(url, proxies=proxies, timeout=30)
html = response.text
# Lưu HTML vào cache trong 24 giờ
cache.setex(cache_key, 86400, html)
return html
Giải thích:
-
hashlib.md5()tạo mã ngắn từ URL. -
cache.get()kiểm tra dữ liệu đã có chưa. -
Nếu có cache, hệ thống trả dữ liệu cũ.
-
Nếu chưa có, hệ thống crawl mới và lưu lại trong 24 giờ.
Cách này đặc biệt hữu ích với trang tin, blog hoặc danh mục sản phẩm không thay đổi liên tục.
Giảm dung lượng tải về
Nếu anh em chỉ cần văn bản, đừng tải ảnh, CSS, font và video. Với Puppeteer, có thể chặn các loại tài nguyên không cần thiết.
await page.setRequestInterception(true);
page.on('request', request => {
const resourceType = request.resourceType();
if (['image', 'stylesheet', 'font', 'media'].includes(resourceType)) {
request.abort();
} else {
request.continue();
}
});
Đoạn này giúp trình duyệt bỏ qua ảnh, CSS, font và media. Nhờ đó, tốc độ load nhanh hơn và dung lượng proxy giảm xuống.
Tuy nhiên, nếu website cần CSS hoặc ảnh để render dữ liệu, anh em cần kiểm tra kỹ trước khi chặn.
Theo dõi chỉ số chi phí
Muốn tối ưu chi phí, anh em cần đo được chi phí. Đừng chỉ nhìn tổng tiền proxy mỗi tháng.
Nên theo dõi các chỉ số sau:
|
Chỉ số |
Mốc nên theo dõi |
Khi lệch cần làm gì |
|
Tỷ lệ thành công |
Trên 90% |
Giảm tốc độ, đổi proxy, kiểm tra logic crawl |
|
Tốc độ xử lý |
50-200 request/phút/worker |
Thêm worker hoặc tối ưu code |
|
Chi phí/1.000 bản ghi |
Theo từng dự án |
Giảm dung lượng, dùng datacenter cho nguồn dễ |
|
Tỷ lệ trùng lặp |
Dưới 5% |
Cải thiện deduplicate URL |
|
Lỗi 403/429 |
Càng thấp càng tốt |
Tăng delay, đổi chiến lược xoay IP |
Nếu không đo, anh em sẽ không biết tiền đang mất ở đâu. Có khi vấn đề không nằm ở proxy, mà nằm ở việc tải quá nhiều dữ liệu không cần thiết.
Quy trình triển khai Proxy training AI dễ áp dụng
Để dễ làm, anh em có thể đi theo 6 bước sau.
Bước 1: Phân loại nguồn dữ liệu
Trước tiên, hãy chia nguồn thành nhóm dễ, trung bình và khó. Nhóm dễ dùng datacenter. Nhóm khó dùng residential. Nhóm cần mobile mới dùng mobile proxy.
Bước 2: Chọn chiến lược xoay IP
Nếu URL độc lập, dùng rotating proxy theo request. Nếu cần giữ phiên, dùng sticky session. Nếu cần kiểm soát sâu, dùng pool IP tĩnh.
Bước 3: Chọn công cụ crawl
Website tĩnh dùng Scrapy hoặc requests. Website động dùng Playwright, Puppeteer hoặc Crawlee. Dự án rất lớn có thể cân nhắc Apache Nutch.
Bước 4: Thiết kế hàng đợi và worker
Không nên crawl tất cả trong một script. Hãy dùng hàng đợi, worker, retry và log để hệ thống dễ mở rộng.
Bước 5: Lưu dữ liệu có cấu trúc
Mỗi bản ghi nên có URL nguồn, thời gian crawl, loại dữ liệu, trạng thái xử lý và nội dung đã parse. Điều này giúp anh em kiểm tra lại khi mô hình có lỗi dữ liệu.
Bước 6: Theo dõi và tối ưu
Sau khi chạy thử, hãy nhìn tỷ lệ lỗi, tốc độ, dung lượng và chi phí. Đừng mở rộng ngay khi chưa biết hệ thống đang nghẽn ở đâu.
Một cách an toàn là bắt đầu với 10-20 nguồn nhỏ. Khi đã ổn, anh em mới tăng số domain, tăng worker và tăng pool proxy.
Lưu ý quan trọng khi dùng Proxy training AI
Proxy giúp crawl ổn định hơn, nhưng anh em không nên dùng proxy để lấy dữ liệu trái phép. Đây là điểm cần nói rõ.
Theo Google Search Central về robots.txt, robots.txt giúp website hướng dẫn crawler URL nào có thể truy cập, chủ yếu để tránh bị quá tải bởi request. Vì vậy, trước khi crawl, anh em nên kiểm tra robots.txt, điều khoản sử dụng và chính sách dữ liệu của nguồn.
Một quy trình tốt nên có các nguyên tắc sau:
-
Chỉ crawl nguồn được phép.
-
Không gửi request quá dày.
-
Tôn trọng robots.txt và điều khoản website.
-
Không thu thập dữ liệu nhạy cảm.
-
Không phá CAPTCHA, đăng nhập hoặc lớp bảo vệ trái phép.
-
Lưu nguồn dữ liệu để kiểm tra lại khi cần.
-
Có cơ chế xóa dữ liệu nếu nguồn yêu cầu.
Đây không chỉ là vấn đề kỹ thuật. Đây còn là vấn đề chất lượng dữ liệu, rủi ro pháp lý và uy tín của dự án AI.
Proxy training AI giúp anh em thu thập dữ liệu lớn ổn định hơn khi biết chọn đúng loại proxy, xoay vòng IP hợp lý, dùng công cụ phù hợp và kiểm soát chi phí bằng cache, giới hạn tải và giám sát chỉ số. Khi cần hệ thống proxy ổn định, ít mất kết nối và có hỗ trợ kỹ thuật, anh em có thể tham khảo Proxy.vn - Nhà cung cấp dịch vụ proxy chất lượng hàng đầu Việt Nam cho kế hoạch Proxy training AI.