0

Hướng dẫn Crawl Data: Kinh nghiệm thực tế từ Tripadvisor

Crawl data là một kỹ năng quan trọng trong xử lý dữ liệu web. Trong bài viết này, tôi sẽ chia sẻ về cơ bản crawl data, sự khác nhau giữa SSR và CSR, cách crawl dữ liệu cho từng loại, các hình thức chặn, và kinh nghiệm thực tế của tôi khi crawl dữ liệu từ Tripadvisor.

1. Crawl Data là gì?

Crawl data (web scraping) là quá trình tự động thu thập dữ liệu từ các trang web. Dữ liệu có thể là thông tin sản phẩm, review, giá cả, bài viết,... thay vì phải copy thủ công.

Crawl data giúp:

  • Thu thập dữ liệu phục vụ phân tích, machine learning, hoặc nghiên cứu.
  • Tự động hóa các công việc lặp đi lặp lại trên web.
  • Xây dựng cơ sở dữ liệu từ nhiều nguồn khác nhau.

2. SSR và CSR

Trong web hiện đại, có hai loại rendering phổ biến:

2.1 Server-Side Rendering (SSR)

Server-Side Rendering (SSR) là phương pháp mà nội dung HTML của một trang web được tạo ra hoàn toàn trên server trước khi gửi về trình duyệt của người dùng. Khi người dùng truy cập trang, server sẽ trả về HTML hoàn chỉnh mà trình duyệt chỉ cần hiển thị.

  • Ví dụ: Các trang web cũ trước kia như các trang liên quan đến chính phủ hay các trang tin tức chẳng hạn.
  • Ưu điểm: SEO tốt
  • Nhược điểm: Server phải chịu tải nặng hơn

2.2 Client-Side Rendering (CSR)

Client-Side Rendering (CSR) là phương pháp mà trình duyệt của người dùng chịu trách nhiệm render nội dung của trang web bằng JavaScript. Khi truy cập trang, server thường chỉ trả về HTML rỗng hoặc tối giản, sau đó JavaScript trên trình duyệt sẽ gọi API, tải dữ liệu và tạo ra nội dung hiển thị.

  • Ví dụ: các trang web hiện đại như Facebook, Tiki, Shope,...
  • Ưu điểm: Trải nghiệm người dùng mượt mà, Server đỡ phải chịu tải cao
  • Nhược điểm: SEO không tốt (tuy nhiên hiện nay các trình duyệt đã cải tiến hơn cho SEO CSR)

3. Cách crawl dữ liệu

3.1 Crawl SSR (Server-Side Rendering)

Với các trang SSR, dữ liệu đã có sẵn trong HTML trả về từ server, nên bạn có thể gửi HTTP request trực tiếp và phân tích HTML mà không cần render JavaScript.

Các bước cơ bản:

  1. Gửi HTTP request đến server
    • Dùng requests (Python) để lấy HTML.
  2. Phân tích HTML
    • Dùng BeautifulSoup để parse HTML và trích xuất dữ liệu.
  3. Extract dữ liệu cần thiết
    • Chọn các tag hoặc class chứa dữ liệu bạn quan tâm, ví dụ h2.title.
  4. Xử lý dữ liệu
    • Lưu vào list, CSV, database hoặc xử lý tiếp tùy nhu cầu.

# Ví dụ crawl SSR bằng Python chi tiết

# Bước 1: Import thư viện
import requests
from bs4 import BeautifulSoup

# Bước 2: Gửi request tới trang SSR
url = "https://example.com/page"  # Thay bằng URL thực tế
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/142.0.0.0 Safari/537.36"
}
resp = requests.get(url, headers=headers)  # Gửi request kèm headers giả lập trình duyệt

# Kiểm tra request thành công
if resp.status_code == 200:
    html_content = resp.text
else:
    print(f"Request failed with status code: {resp.status_code}")
    html_content = ""

# Bước 3: Parse HTML bằng BeautifulSoup
soup = BeautifulSoup(html_content, "html.parser")

# Bước 4: Trích xuất dữ liệu
# Ví dụ: lấy tất cả tiêu đề bài viết nằm trong thẻ <h2 class="title">
titles = [t.text.strip() for t in soup.select("h2.title")]

# Bước 5: Xử lý dữ liệu
# In ra hoặc lưu vào file/database
print("Danh sách tiêu đề bài viết:")
for idx, title in enumerate(titles, 1):
    print(f"{idx}. {title}")
    

3.2 Crawl CSR (Client-Side Rendering)

Với các trang CSR, HTML ban đầu thường rỗng, dữ liệu được load bằng JavaScript. Do đó, bạn cần thực thi JavaScript hoặc tìm API để lấy dữ liệu.

3.2.1 Trường hợp 1: Crawl bằng API (nếu API công khai)

Một số website CSR thực hiện AJAX request để load dữ liệu. Nếu bạn tìm được endpoint API, bạn có thể crawl trực tiếp:

import requests

# URL API giả lập
api_url = "https://example.com/api/products?page=1"
headers = {
    "User-Agent": "Mozilla/5.0",
    "Accept": "application/json"
}

resp = requests.get(api_url, headers=headers)

if resp.status_code == 200:
    data = resp.json()  # Dữ liệu trả về thường là JSON
    for item in data["products"]:
        print(f"{item['name']} - {item['price']}")
else:
    print(f"API request failed: {resp.status_code}")

Lưu ý:

  • API có thể yêu cầu token, session, cookie.
  • Một số API trả dữ liệu được mã hóa hoặc nén, cần phân tích request network trên DevTools.

3.2.2 Trường hợp 2: API bị ẩn hoặc web chặn crawl

Nhiều website cố tình ẩn API hoặc chặn request không hợp lệ, ví dụ:

  • Dữ liệu trả về chỉ khi có session hợp lệ.
  • API yêu cầu header đặc biệt, token động, hoặc signature.
  • rate-limit, CAPTCHA hoặc IP block.

Trong trường hợp này, bạn cần mô phỏng trình duyệt thật:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

# Cấu hình Chrome headless (không hiện cửa sổ trình duyệt)
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")

driver = webdriver.Chrome(options=chrome_options)

# Truy cập trang CSR
driver.get("https://example.com/csr-page")

# Đợi JavaScript load dữ liệu
time.sleep(5)

# Thao tác như cuộn trang hay click xem thêm
...

# Lấy HTML sau khi render
html_content = driver.page_source

# Xử lý dữ liệu với BeautifulSoup hoặc thư viện khác
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, "html.parser")
items = [t.text.strip() for t in soup.select("div.product-item")]
for idx, item in enumerate(items, 1):
    print(f"{idx}. {item}")

driver.quit()

Kỹ thuật để tránh bị chặn:

  1. Sleep / Delay ngẫu nhiên giữa các request.
  2. Xóa cookies hoặc tạo session mới.
  3. Proxy / IP rotation để tránh bị block.
  4. User-Agent khác nhau hoặc mô phỏng trình duyệt thật.
  5. Nếu CAPTCHA xuất hiện, cần giải CAPTCHA tự động bằng AI hoặc thủ công.

4. Các hình thức chặn crawl

Các website hiện nay thường có cơ chế chống crawl:

  • Captcha: yêu cầu xác nhận người dùng thật.
  • Rate limiting / Blocking IP: chặn IP gửi quá nhiều request.
  • Dynamic content: dữ liệu load theo session hoặc token.
  • Honey pot / Fake links: phát hiện bot thông qua các link không hiển thị.

5. Kinh nghiệm crawl Tripadvisor

Tripadvisor sử dụng Server-Side Rendering (SSR) cho hầu hết trang review và thông tin khách sạn, nghĩa là dữ liệu đã có sẵn trong HTML trả về. Tuy nhiên, trang web vẫn có cơ chế chống bot khá nghiêm ngặt.

5.1 Cơ chế chống bot của Tripadvisor

  • CAPTCHA: hiển thị khi hệ thống nghi ngờ hành vi tự động.
  • IP block / Rate limiting: chặn những IP gửi quá nhiều request trong thời gian ngắn.
  • Session timeout / Cookies: yêu cầu session hợp lệ để truy cập dữ liệu.

5.2 Giải pháp crawl SSR Tripadvisor

Dựa trên kinh nghiệm thực tế, mình đã áp dụng các bước sau để crawl dữ liệu hiệu quả:

  1. Gửi request SSR trực tiếp

    • Dữ liệu review, tên khách sạn, đánh giá,… đã có sẵn trong HTML.
    • Dùng requests + BeautifulSoup hoặc Scrapy để parse HTML.
  2. Giả lập hành vi người dùng

    • Thêm Sleep / Delay ngẫu nhiên giữa các request để tránh bị detect.
    • Xóa cookies hoặc tạo session mới định kỳ để tránh session timeout.
  3. Sử dụng proxy rotation

    • Dùng proxy để thay đổi IP liên tục, tránh bị block.
    • Có thể thuê proxy giá rẻ từ các dịch vụ như ckey.vn, đồng thời kết hợp CPU/GPU thuê để tăng tốc quá trình crawl nếu cần xử lý nhiều trang cùng lúc.
  4. Tối ưu tài nguyên

    • Khi crawl số lượng lớn, có thể thuê server CPU hoặc GPU giá rẻ từ ckey.vn để chạy script, kết hợp proxy rotation và delay, giúp quá trình crawl ổn định và hiệu quả hơn.

6. Kết luận

  • Crawl data là kỹ năng quan trọng nhưng cần tuân thủ nguyên tắc pháp lýrobots.txt của website.
  • CSR dễ crawl hơn SSR trong vài trường hợp nếu không quá nghiêm ngặt trong API endpoint.
  • Kinh nghiệm cá nhân: selenium + delay + cookies + proxy là một combo hiệu quả cho các trang phức tạp.
  • Việc thử nghiệm và tối ưu kỹ thuật là cần thiết để crawl ổn định và an toàn.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí