VPS Cho Web Scraping & Crawl Data 2026 - Thu Thập Dữ Liệu Tự Động, Proxy Xoay, Chống Anti-Bot
1. Tại Sao Cần VPS Cho Web Scraping?
Chạy script scrape trên laptop cá nhân nghe có vẻ tiện — nhưng thực tế là ác mộng. Laptop tắt khi bạn đóng nắp, mạng nhà ping cao, IP bị block sau 100 request, và Windows tự động update giữa chừng làm hỏng cả session crawl đã chạy 3 tiếng.
VPS giải quyết triệt để những vấn đề này:
- Chạy 24/7 không nghỉ: Script scrape chạy liên tục trong data center, có nguồn dự phòng, internet redundant
- Băng thông lớn: 100Mbps-1Gbps unmetered, không lo nghẽn mạng như wifi nhà
- IP datacenter sạch: Không bị giới hạn bởi ISP dân dụng, dễ thay IP khi cần
- Tài nguyên chuyên dụng: CPU và RAM dedicated, xử lý hàng triệu record không giật lag
- Đa luồng thực sự: VPS 4-8 core chạy 10-50 spider cùng lúc không vấn đề
2. Cấu Hình VPS Tối Ưu Cho Web Scraping
Không phải VPS nào cũng phù hợp để scrape. Dưới đây là cấu hình tối thiểu và khuyến nghị cho từng loại dự án scraping:
| Loại Dự Án | CPU | RAM | Ổ Cứng | Băng Thông | Chi Phí/Tháng |
|---|---|---|---|---|---|
| Crawl nhẹ (<10.000 page/ngày) | 2 core | 2GB | 30GB SSD | Unmetered | ~40K-80K |
| Crawl trung bình (10K-100K page/ngày) | 4 core | 4GB | 60GB SSD | Unmetered | ~120K-200K |
| Crawl nặng (100K-1M page/ngày) | 8 core | 8-16GB | 120GB SSD | 1Gbps | ~350K-600K |
| Scraping cluster (multi-VPS) | 4 core x 3-5 VPS | 4GB/VPS | 60GB/VPS | Unmetered | ~400K-800K |
3. Các Công Cụ Scraping Phổ Biến & Cách Cài Trên VPS
3.1. Scrapy — Spider Framework Mạnh Nhất
Scrapy là framework scraping #1 cho Python, hỗ trợ middleware, auto-throttle, export đa định dạng:
# Cài Scrapy trên VPS
sudo apt update && sudo apt install python3 python3-pip -y
pip3 install scrapy scrapy-user-agents scrapy-proxy-middleware
# Tạo project Scrapy
scrapy startproject myproject
cd myproject
# Tạo spider cơ bản
cat > myproject/spiders/example.py << 'EOF'
import scrapy
class ExampleSpider(scrapy.Spider):
name = "example"
start_urls = ["https://example.com/products"]
def parse(self, response):
for product in response.css("div.product"):
yield {
"name": product.css("h2::text").get(),
"price": product.css("span.price::text").get(),
}
next_page = response.css("a.next::attr(href)").get()
if next_page:
yield response.follow(next_page, self.parse)
EOF
# Chạy spider với auto-throttle
scrapy crawl example -o output.json --set AUTOTHROTTLE_ENABLED=True
3.2. Puppeteer / Playwright — Render JavaScript
Nhiều website hiện đại render bằng React/Vue/Angular — Scrapy không xử lý được. Bạn cần headless browser:
# Cài Node.js và Puppeteer
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs -y
npm install puppeteer
# Script crawl SPA đơn giản
cat > scrape-spa.js << 'EOF'
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({
headless: "new",
args: ["--no-sandbox", "--disable-setuid-sandbox"]
});
const page = await browser.newPage();
await page.goto("https://example.com/spa-products", {
waitUntil: "networkidle2"
});
const data = await page.evaluate(() => {
return [...document.querySelectorAll(".product-card")].map(card => ({
name: card.querySelector(".title")?.innerText,
price: card.querySelector(".price")?.innerText,
}));
});
console.log(JSON.stringify(data, null, 2));
await browser.close();
})();
EOF
node scrape-spa.js
--disable-dev-shm-usage để tránh crash trên VPS RAM thấp.
3.3. Playwright — Thay Thế Hiện Đại Cho Puppeteer
Playwright của Microsoft hỗ trợ Chromium + Firefox + WebKit, auto-wait, và API network interception mạnh hơn:
# Cài Playwright
pip3 install playwright
playwright install --with-deps chromium
# Script scrape với network interception
from playwright.sync_api import sync_playwright
import json
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com")
items = page.query_selector_all(".product")
data = [{"name": i.inner_text().split("\n")[0],
"price": i.query_selector(".price").inner_text()}
for i in items]
with open("output.json", "w") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
browser.close()
4. Kỹ Thuật Chống Anti-Bot & Proxy Xoay
Sau 100-200 request, hầu hết website bắt đầu chặn IP của bạn. Đây là cách vượt qua:
4.1. Proxy Xoay (Rotating Proxy)
Dùng pool proxy để mỗi request đi qua một IP khác nhau:
# Cài proxy middleware cho Scrapy
pip3 install scrapy-rotating-proxies
# Thêm vào settings.py
ROTATING_PROXY_LIST = [
'http://proxy1:port',
'http://proxy2:port',
'socks5://proxy3:port',
]
DOWNLOADER_MIDDLEWARES = {
'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}
ROTATING_PROXY_BAN_POLICY = 'rotating_proxies.policy.BanDetectionPolicy'
ROTATING_PROXY_PAGE_RETRY_TIMES = 5
4.2. User-Agent Rotation
# Cài scrapy-fake-useragent
pip3 install scrapy-fake-useragent
# settings.py
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy_fake_useragent.middleware.RandomUserAgentMiddleware': 400,
}
FAKEUSERAGENT_PROVIDERS = [
'scrapy_fake_useragent.providers.FakeUserAgentProvider',
'scrapy_fake_useragent.providers.FakerProvider',
]
4.3. Delay Thông Minh (Auto-Throttle)
# Scrapy settings.py
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 1.0
AUTOTHROTTLE_MAX_DELAY = 10.0
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
DOWNLOAD_DELAY = 0.5
RANDOMIZE_DOWNLOAD_DELAY = True
CONCURRENT_REQUESTS_PER_DOMAIN = 4
4.4. Custom Headers & Cookies
# Cấu hình headers giả lập browser thật
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'vi-VN,vi;q=0.9,en;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Cache-Control': 'no-cache',
'Pragma': 'no-cache',
'Sec-Ch-Ua': '"Chromium";v="122", "Not(A:Brand";v="24"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Linux"',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
}
5. Lưu Trữ & Xử Lý Data Sau Khi Crawl
Sau khi crawl xong, bạn cần lưu trữ và xử lý data. Các lựa chọn phổ biến:
| Phương Pháp | Quy Mô | Ưu Điểm | Nhược Điểm |
|---|---|---|---|
| JSON/CSV file | <100K records | Đơn giản, không cần setup | Không query được, chậm với lượng lớn |
| SQLite | 100K-1M records | Nhẹ, không cần server | Không hỗ trợ concurrent write |
| PostgreSQL | 1M-100M records | Mạnh, full-text search, JSONB | Cần cài đặt và tối ưu |
| MongoDB | 1M+ records | Schema flexible, dễ scale | RAM intensive, cần index tốt |
| Elasticsearch | 10M+ records | Search toàn văn siêu nhanh | Cấu hình phức tạp, ngốn RAM |
# Pipeline Scrapy lưu vào PostgreSQL
# pipelines.py
import psycopg2
class PostgresPipeline:
def open_spider(self, spider):
self.conn = psycopg2.connect(
host="localhost", database="scrapedb",
user="scraper", password="yourpass"
)
self.cur = self.conn.cursor()
def process_item(self, item, spider):
self.cur.execute("""
INSERT INTO products (name, price, url, scraped_at)
VALUES (%s, %s, %s, NOW())
ON CONFLICT (url) DO UPDATE SET price = EXCLUDED.price
""", (item["name"], item["price"], item["url"]))
self.conn.commit()
return item
def close_spider(self, spider):
self.cur.close()
self.conn.close()
6. Scheduling & Monitoring Crawl Jobs
Không ai ngồi gõ lệnh scrape mỗi ngày. Tự động hóa bằng cron:
# Chạy spider mỗi 6 tiếng
# crontab -e
0 */6 * * * cd /home/scraper/myproject && scrapy crawl example -o /data/$(date +\%Y\%m\%d_\%H\%M).json
# Chạy Puppeteer script mỗi sáng 6AM
0 6 * * * /usr/bin/node /home/scraper/scrape-spa.js >> /var/log/scrape.log 2>&1
# Dọn data cũ > 30 ngày
0 2 * * 0 find /data/ -name "*.json" -mtime +30 -delete
6.1. Monitor Bằng Uptime Kuma
Cài Uptime Kuma để giám sát script scrape (tham khảo bài cài Uptime Kuma trên VPS):
- Push monitor: Script scrape gửi heartbeat sau mỗi lần chạy thành công
- Alert Telegram/Discord: Nhận thông báo khi scrape fail
- Status page: Dashboard trực quan tình trạng tất cả spider
7. So Sánh VPS Provider Cho Web Scraping
| Provider | Cấu Hình Entry | Giá | Băng Thông | IP | Phù Hợp |
|---|---|---|---|---|---|
| TrumVPS | 2 core/2GB/30GB NVMe | 40K | Unmetered | 1 IPv4 | Crawl vừa & nhỏ, tiết kiệm |
| Netihot Basic | 2 core/2GB/30GB SSD | 85K | Unmetered | 1 IPv4 | Crawl trung bình, ổn định |
| Vultr | 1 core/1GB/25GB NVMe | $6 (~150K) | 2TB | 1 IPv4 | Crawl nhẹ, ping quốc tế tốt |
| Hetzner | 2 core/4GB/40GB NVMe | €4 (~110K) | 20TB | 1 IPv4 | Crawl nặng, nhiều data EU |
8. Câu Hỏi Thường Gặp
Crawl bao nhiêu page thì bị chặn?
Tùy website. Trang nhỏ (blog, tin tức) thường chặn sau 100-200 request/phút. Trang lớn (Shopee, Lazada) có anti-bot từ request đầu tiên. Luôn dùng proxy xoay + delay 0.5-2s + user-agent rotation.
Có nên dùng VPN thay vì proxy không?
Không. VPN cung cấp 1 IP duy nhất, bị block là xong. Proxy pool cho phép xoay hàng trăm IP. Hơn nữa, VPN thường giới hạn băng thông và tốc độ thấp hơn IP datacenter trực tiếp.
VPS 40K có đủ để scrape 100K page/ngày không?
Phụ thuộc vào độ phức tạp của trang. Với static HTML + Scrapy, hoàn toàn khả thi. Với SPA cần JavaScript rendering, cần VPS mạnh hơn (4GB+ RAM) hoặc giảm tốc độ để tránh crash.
Làm sao để scrape mà không vi phạm pháp luật?
Chỉ scrape dữ liệu công khai. Đọc và tôn trọng robots.txt. Không scrape thông tin cá nhân, dữ liệu có bản quyền, hoặc dữ liệu yêu cầu đăng nhập trừ khi được phép. Giới hạn tốc độ để không gây quá tải server đối phương.
Có nên scrape từ VPS nước ngoài không?
Nếu scrape website Việt Nam, VPS Việt Nam cho ping thấp hơn (1-5ms vs 150ms). Website VN cũng ít chặn IP Việt Nam hơn IP nước ngoài. Ngược lại, scrape website quốc tế thì dùng VPS cùng khu vực địa lý.
Bắt Đầu Scrape Ngay Hôm Nay!
VPS giá chỉ từ 40.000đ/tháng — băng thông không giới hạn, IP Việt Nam, cài đặt 1-click.
Thuê VPS Scraping Ngay →