VPS Cho Web Scraping & Crawl Data 2026 - Thu Thập Dữ Liệu Tự Động, Proxy Xoay, Chống Anti-Bot

📅 28/05/2026 · ⏱ 13 phút đọc · 🏷 Dev · MMO

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:

💡 Con số thực tế: Một spider Scrapy chạy trên VPS 4 core/4GB RAM có thể crawl 50.000 - 200.000 page/ngày tùy độ phức tạp. Cùng cấu hình trên laptop chỉ đạt 20-40% do giới hạn mạng và CPU chia sẻ.

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ự ÁnCPURAMỔ CứngBăng ThôngChi Phí/Tháng
Crawl nhẹ (<10.000 page/ngày)2 core2GB30GB SSDUnmetered~40K-80K
Crawl trung bình (10K-100K page/ngày)4 core4GB60GB SSDUnmetered~120K-200K
Crawl nặng (100K-1M page/ngày)8 core8-16GB120GB SSD1Gbps~350K-600K
Scraping cluster (multi-VPS)4 core x 3-5 VPS4GB/VPS60GB/VPSUnmetered~400K-800K
🎯 Mẹo chọn VPS scraping: Ưu tiên băng thông unmeteredổ SSD NVMe hơn là CPU mạnh. Scraping là I/O-bound và network-bound, không phải CPU-bound. RAM 4GB đủ cho hầu hết spider Python, trừ khi bạn dùng headless browser.

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
⚠️ Lưu ý Puppeteer: Headless Chrome ngốn RAM khủng khiếp (~300-500MB mỗi instance). Với VPS 4GB, đừng chạy quá 3-4 browser instance cùng lúc. Dùng --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ápQuy MôƯu ĐiểmNhược Điểm
JSON/CSV file<100K recordsĐơn giản, không cần setupKhông query được, chậm với lượng lớn
SQLite100K-1M recordsNhẹ, không cần serverKhông hỗ trợ concurrent write
PostgreSQL1M-100M recordsMạnh, full-text search, JSONBCần cài đặt và tối ưu
MongoDB1M+ recordsSchema flexible, dễ scaleRAM intensive, cần index tốt
Elasticsearch10M+ recordsSearch toàn văn siêu nhanhCấ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):

7. So Sánh VPS Provider Cho Web Scraping

ProviderCấu Hình EntryGiáBăng ThôngIPPhù Hợp
TrumVPS2 core/2GB/30GB NVMe40KUnmetered1 IPv4Crawl vừa & nhỏ, tiết kiệm
Netihot Basic2 core/2GB/30GB SSD85KUnmetered1 IPv4Crawl trung bình, ổn định
Vultr1 core/1GB/25GB NVMe$6 (~150K)2TB1 IPv4Crawl nhẹ, ping quốc tế tốt
Hetzner2 core/4GB/40GB NVMe€4 (~110K)20TB1 IPv4Crawl nặng, nhiều data EU
🎯 Khuyến nghị: Để scrape website Việt Nam với ngân sách thấp, TrumVPS 40K là lựa chọn tốt nhất — băng thông unmetered, IP Việt Nam ping thấp đến server nội địa. Nếu crawl quốc tế hoặc cần nhiều IP, cân nhắc thêm proxy dân cư từ bên thứ 3.

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 →