Tự động thu thập dữ liệu Airbnb: Nắm bắt thông tin bất động sản ngay lập tức

Cập nhật lần cuối vào April 28, 2026

Airbnb hiện có hơn trên 220+ quốc gia — nhưng lại không cung cấp API công khai cho dữ liệu thị trường. Nếu bạn cần thông tin về giá, so sánh với đối thủ hoặc một bộ dữ liệu phục vụ nghiên cứu, thì thu thập dữ liệu gần như là lựa chọn duy nhất.

Vấn đề là gì? Airbnb là một trong những trang web khó thu thập dữ liệu nhất trên web hiện đại. Trang này chạy WAF tùy chỉnh kèm Akamai Bot Manager, render mọi thứ ở phía client bằng React, và liên tục đổi tên lớp CSS như một người thợ khóa đa nghi cứ thay ổ liên tục. Tôi đã dành rất nhiều thời gian thử đủ kiểu cách để thu thập dữ liệu Airbnb — từ các thư viện HTTP gọn nhẹ, tự động hóa trình duyệt đầy đủ, cho đến công cụ AI không cần code — và thực tế là không có cách nào hoàn hảo cho mọi trường hợp.

Hướng dẫn này sẽ đi qua cả năm cách khả thi, kèm code thực tế, đánh đổi rõ ràng và mẹo thực dụng để tránh bị chặn IP đến mức “bay màu”. Dù bạn là lập trình viên Python, chuyên viên phân tích dữ liệu hay nhà đầu tư bất động sản chỉ muốn có một bảng tính, ở đây đều có cách phù hợp cho bạn.

Vì sao nên thu thập dữ liệu Airbnb? Các trường hợp sử dụng thực tế

Không ai đi thu thập dữ liệu Airbnb chỉ để “cho vui” với HTML lồng nhau. Mọi người đều có dự án và mục tiêu kinh doanh cụ thể — dưới đây là sáu trường hợp phổ biến nhất:

Trường hợp sử dụngDữ liệu bạn thu thậpAi dùng
Chiến lược định giá độngGiá thuê theo đêm của đối thủ trong một bán kính nhất địnhChủ nhà, quản lý bất động sản
Phân tích đầu tưChỉ báo công suất thuê (tần suất đánh giá, tình trạng còn trống của lịch), ADR, RevPARNhà đầu tư bất động sản
So sánh phí dọn dẹpPhí dọn dẹp theo từng loại bất động sản (mức trung bình dao động từ $81–$335 ở các thành phố lớn của Mỹ)Chủ nhà, chuyên gia tư vấn giá
Phân tích cảm xúc từ đánh giáĐánh giá của khách để chấm điểm NLP/cảm xúcNhà khoa học dữ liệu, đội ngũ dịch vụ lưu trú
Nghiên cứu học thuậtBộ dữ liệu cấp thị trường cho chính sách nhà ở, du lịch, kinh tế đô thịNhà nghiên cứu (48,7% trong số 1.021 bài báo học thuật liên quan đến Airbnb đã dùng dữ liệu thu thập)
Theo dõi đối thủTin đăng mới, thay đổi giá, tình trạng còn trống theo thời gianNhà vận hành STR, nhà phân tích thị trường

Với các nhu cầu liên tục như theo dõi giá hoặc bám sát đối thủ, thu thập dữ liệu theo lịch hoặc tự động hóa đặc biệt hữu ích — bạn cần dữ liệu mới, không phải ảnh chụp một lần.

Thị trường cho thuê ngắn hạn đang tăng nhanh hơn khách sạn truyền thống: nhu cầu STR trong khi nhu cầu khách sạn giảm 0,3%. Nếu bạn đang hoạt động trong lĩnh vực này, dữ liệu chính là lợi thế cạnh tranh của bạn.

Điều gì khiến thu thập dữ liệu Airbnb trở nên khó?

Trước khi viết bất kỳ dòng code nào, bạn nên hiểu vì sao Airbnb được đánh giá về độ khó thu thập dữ liệu. Có ba vấn đề chồng lên nhau.

Các lớp chống bot của Airbnb

Airbnb dùng WAF tùy chỉnh kết hợp với , một hệ thống phát hiện bot cấp doanh nghiệp chấm điểm từng request trên nhiều chiều cùng lúc. Đây không chỉ là giới hạn tốc độ — mà là tạo dấu vân tay bằng AI.

airbnb-unique-stays.webp

Chuỗi phát hiện, xếp theo mức độ rủi ro:

  • Dấu vân tay TLS (CAO): Thư viện requests của Python có dấu bắt tay TLS rất đặc trưng, không khớp với bất kỳ trình duyệt thật nào. Akamai phân tích bộ mật mã, extension và thứ tự ALPN bằng các phương pháp JA3/JA4. requests tiêu chuẩn chỉ đạt khoảng , so với 92% của các thư viện giả lập dấu vân tay TLS của trình duyệt.
  • Thực thi JavaScript (CAO): Akamai triển khai script phía client để thu thập “dữ liệu cảm biến” — thuộc tính thiết bị, khả năng phần cứng, chi tiết hệ điều hành. Từ đó tạo cookie _abck. Nếu không chạy JavaScript này, request sẽ bị chặn.
  • Dấu vân tay trình duyệt (CAO): Canvas, WebGL và phân tích font chữ giúp phát hiện công cụ tự động hóa. Trình duyệt headless lộ cờ navigator.webdriver, thiếu plugin và giá trị phần cứng không nhất quán.
  • Phân tích header HTTP (CAO): Thiếu các header Sec-Fetch-* là một trên Airbnb.
  • Uy tín IP (TRUNG BÌNH): IP từ datacenter sẽ bị chặn ngay. Proxy residential là bắt buộc khi làm ở quy mô lớn.
  • Phân tích hành vi (TRUNG BÌNH): Thời gian quá đều, không di chuyển chuột, không cuộn trang — đều là dấu hiệu rất rõ.

Khi bị chặn, bạn sẽ thấy: 403 Forbidden (lỗi dấu vân tay), 429 Too Many Requests (giới hạn tốc độ), 503 Service Unavailable (trang thách thức của Akamai), hoặc trang CAPTCHA.

Các trang Airbnb động, nặng JavaScript

Một lệnh requests.get() bình thường tới Airbnb sẽ trả về một khung React với HTML giữ chỗ — không có dữ liệu tin đăng thực tế. Như : “Các request HTTP thuần túy đơn giản là không hoạt động, và nếu không có proxy phù hợp cùng việc render JavaScript thật, bạn không hề thu thập dữ liệu Airbnb — bạn chỉ đang thu thập các phần giữ chỗ.”

Dữ liệu thực tế được lấy phía client thông qua các cuộc gọi API GraphQL nội bộ (/api/v3/StaysSearch cho kết quả tìm kiếm, /api/v3/PdpPlatformSections cho chi tiết tin đăng). Điều này có nghĩa là phần lớn dữ liệu hữu ích sẽ cần либо một trình duyệt đầy đủ hoặc can thiệp vào API.

DOM thay đổi liên tục

Airbnb dùng CSS-in-JS với các tên lớp được băm và thay đổi mỗi lần triển khai. Các ví dụ đã được ghi nhận gồm _tyxjp1, lxq01kf, atm_mk_h2mmj6, t1jojoys_8s3ctt. Như giải thích: “Những lớp này không được thiết kế để ổn định và có thể thay đổi bất cứ lúc nào, thường là không có thay đổi hiển thị nào trên trang.”

Cộng đồng lập trình đã ghi lại rất nhiều “nỗi đau” này. rằng “các lớp CSS thay đổi liên tục, và dựa vào chúng là cách nhanh nhất để làm hỏng scraper của bạn.” Một lập trình viên có kinh nghiệm trên DEV Community tóm gọn rất hay: “Một scraper chạy chậm hơn 50% nhưng không bao giờ hỏng vẫn có giá trị hơn vô hạn so với một scraper nhanh nhưng chết mỗi tuần.”

Ước tính trong ngành cho thấy do DOM thay đổi, cập nhật dấu vân tay hoặc giới hạn endpoint.

Chọn cách tiếp cận của bạn: 5 cách thu thập dữ liệu Airbnb

Trước khi vào code, đây là bảng so sánh. Mỗi cách đều có đánh đổi thực sự — không có phương pháp nào “tốt nhất” cho mọi tình huống.

Cách tiếp cậnCông sức thiết lậpTốc độKhả năng chống botBảo trìPhù hợp nhất cho
HTTP thuần (requests / pyairbnb)ThấpNhanhTrung bình (dễ vỡ khi API đổi)Trung bìnhNghiên cứu nhanh, bộ dữ liệu nhỏ
Tự động hóa trình duyệt (Selenium)CaoChậmTrung bìnhCao (dễ vỡ do DOM)Nội dung động, giá phụ thuộc ngày
Tự động hóa trình duyệt (Playwright)Trung bìnhTrung bìnhTrung bình - CaoTrung bìnhLựa chọn hiện đại thay thế Selenium
API thu thập dữ liệu (ScrapingBee, Bright Data)ThấpNhanhCao (đã có xoay proxy)ThấpThu thập quy mô lớn, dùng cho production
Không cần code (Thunderbit)Tối thiểuNhanhCao (AI thích ứng với thay đổi bố cục)KhôngNgười không biết code, phân tích một lần

Phần còn lại của bài viết sẽ đi từng bước qua các cách làm bằng Python, và có thêm một phần không cần code ở cuối cho những ai muốn bỏ qua code hoàn toàn.

Từng bước: thu thập Airbnb bằng Python với Requests (cách tiếp cận ưu tiên HTTP)

Đây là lựa chọn gọn nhẹ, khởi động nhanh — không cần trình duyệt, không phải lo chromedriver. Đổi lại: chỉ hoạt động với một số loại dữ liệu chứ không phải tất cả.

Thiết lập môi trường Python

Tạo thư mục dự án và cấu hình môi trường ảo:

1mkdir airbnb-scraper && cd airbnb-scraper
2python -m venv venv
3source venv/bin/activate  # Windows: venv\Scripts\activate
4pip install requests beautifulsoup4 pandas pyairbnb

pyairbnb là một thư viện gọn nhẹ (, phát hành gần nhất tháng 2/2026) dùng để chặn API GraphQL StaysSearch nội bộ của Airbnb. Nó không hề thu thập HTML, nên ít bị ảnh hưởng bởi việc thay đổi lớp CSS. Mô hình do một người bảo trì duy nhất cũng là một rủi ro, nhưng thư viện vẫn đang được cập nhật tích cực.

Lựa chọn A: dùng pyairbnb để lấy kết quả tìm kiếm nhanh

Cách nhanh nhất để lấy dữ liệu Airbnb có cấu trúc:

1import pyairbnb
2import pandas as pd
3# Tìm kiếm theo địa điểm và ngày
4results = pyairbnb.search_all(
5    query="Austin, TX",
6    checkin="2025-08-01",
7    checkout="2025-08-03",
8    adults=2,
9    currency="USD"
10)
11# Chuyển sang DataFrame
12df = pd.DataFrame(results)
13print(df[['name', 'price', 'rating', 'reviewsCount', 'url']].head())
14df.to_csv("airbnb_austin.csv", index=False)

pyairbnb cũng hỗ trợ get_details(), get_price(), get_reviews(), get_calendar()get_listings_from_user(). Tất cả các hàm đều nhận tham số URL proxy để xoay vòng.

Lựa chọn B: request HTTP thủ công với BeautifulSoup

Nếu bạn không muốn phụ thuộc vào thư viện bên thứ ba, bạn có thể gửi request trực tiếp. Lưu ý: requests thuần sẽ bị chặn nhanh vì dấu vân tay TLS. Dùng curl_cffi (giả lập dấu vân tay TLS của trình duyệt) sẽ cải thiện đáng kể tỷ lệ thành công.

1from curl_cffi import requests as cffi_requests
2from bs4 import BeautifulSoup
3import json
4url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
5headers = {
6    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
7    "Accept-Language": "en-US,en;q=0.9",
8    "Sec-Fetch-Dest": "document",
9    "Sec-Fetch-Mode": "navigate",
10    "Sec-Fetch-Site": "none",
11    "Sec-Fetch-User": "?1",
12}
13response = cffi_requests.get(url, headers=headers, impersonate="chrome131")
14soup = BeautifulSoup(response.text, "html.parser")

Trích xuất dữ liệu từ microdata Schema.org

Airbnb nhúng microdata schema.org trực tiếp vào HTML — và các thẻ ngữ nghĩa này . Hãy tìm các container itemprop="itemListElement":

1listings = soup.find_all("div", itemprop="itemListElement")
2data = []
3for listing in listings:
4    name_tag = listing.find("meta", itemprop="name")
5    url_tag = listing.find("meta", itemprop="url")
6    position_tag = listing.find("meta", itemprop="position")
7    data.append({
8        "name": name_tag["content"] if name_tag else None,
9        "url": url_tag["content"] if url_tag else None,
10        "position": position_tag["content"] if position_tag else None,
11    })
12df = pd.DataFrame(data)
13df.to_csv("airbnb_listings.csv", index=False)

Hạn chế: thẻ schema.org chỉ cho bạn tên tin đăng, URL và vị trí — nhưng không có giá, xếp hạng hay tiện nghi. Muốn có dữ liệu phong phú hơn, bạn cần tự động hóa trình duyệt hoặc can thiệp API.

Từng bước: thu thập Airbnb bằng Python với Selenium hoặc Playwright

Khi bạn cần nội dung động — giá phụ thuộc ngày, tiện nghi ẩn sau nút “Hiển thị thêm”, toàn bộ đánh giá — thì tự động hóa trình duyệt là công cụ phù hợp.

Khi nào nên dùng tự động hóa trình duyệt

  • Trang yêu cầu chọn ngày để hiển thị giá thực tế
  • Tiện nghi và đánh giá bị ẩn sau các phần tử tương tác
  • Bất kỳ dữ liệu nào chỉ tải sau khi JavaScript chạy
  • Khi bạn cần tương tác với trang (cuộn, nhấp)

Selenium vs. Playwright: Playwright đã thắng thế (phần lớn)

Playwright đã vượt Selenium để trở thành công cụ tự động hóa trình duyệt được ưu tiên. Nó nhanh hơn, có hỗ trợ async tích hợp, tự cài binary trình duyệt, và xử lý ứng dụng web hiện đại tốt hơn. Vấn đề của Selenium — khi ChromeDriver chậm hơn các bản cập nhật Chrome — vẫn là nỗi đau thường trực.

Dù vậy, Selenium có hệ sinh thái tutorial và câu trả lời trên StackOverflow lớn hơn — nên hãy dùng công cụ bạn thấy thoải mái nhất.

Thiết lập Playwright

1pip install playwright playwright-stealth
2playwright install chromium

Điều hướng tới Airbnb và trích xuất danh sách tin đăng

1import asyncio
2from playwright.async_api import async_playwright
3from playwright_stealth import stealth_async
4import json
5async def scrape_airbnb():
6    async with async_playwright() as p:
7        browser = await p.chromium.launch(headless=False)  # headless=True rủi ro hơn
8        context = await browser.new_context(
9            viewport={"width": 1920, "height": 1080},
10            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
11        )
12        page = await context.new_page()
13        await stealth_async(page)
14        url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
15        await page.goto(url, wait_until="networkidle")
16        # Đợi thẻ tin đăng xuất hiện bằng data-testid (ổn định hơn lớp CSS)
17        await page.wait_for_selector('[data-testid="card-container"]', timeout=15000)
18        # Trích xuất dữ liệu tin đăng
19        listings = await page.query_selector_all('[data-testid="card-container"]')
20        results = []
21        for listing in listings:
22            title_el = await listing.query_selector('[data-testid="listing-card-title"]')
23            subtitle_el = await listing.query_selector('[data-testid="listing-card-subtitle"]')
24            title = await title_el.inner_text() if title_el else None
25            subtitle = await subtitle_el.inner_text() if subtitle_el else None
26            results.append({"title": title, "subtitle": subtitle})
27        await browser.close()
28        return results
29data = asyncio.run(scrape_airbnb())

Can thiệp API GraphQL (cách DIY đáng tin cậy nhất)

Thay vì phân tích các phần tử DOM vốn thay đổi liên tục, bạn có thể chặn các request API nội bộ của Airbnb. Cách này trả về JSON sạch và có cấu trúc:

1api_responses = []
2async def handle_response(response):
3    if "StaysSearch" in response.url:
4        try:
5            data = await response.json()
6            api_responses.append(data)
7        except:
8            pass
9page.on("response", handle_response)
10await page.goto(url, wait_until="networkidle")
11# Phân tích phản hồi API
12if api_responses:
13    search_results = api_responses[0]["data"]["presentation"]["staysSearch"]["results"]["searchResults"]
14    for result in search_results:
15        listing = result.get("listing", {})
16        pricing = result.get("pricingQuote", {})
17        print(f"{listing.get('name')}{pricing.get('price', {}).get('total')}")

Phản hồi StaysSearch bao gồm id, name, roomTypeCategory, bedrooms, bathrooms, personCapacity, avgRating, reviewsCount, isSuperhost và toàn bộ chi tiết giá. Đây cũng chính là dữ liệu mà frontend Airbnb dùng để render trang.

Xử lý phân trang

Airbnb hiển thị khoảng 18 tin đăng mỗi trang và dùng tham số URL items_offset. Giới hạn tối đa xấp xỉ 17 trang (~300 tin đăng cho mỗi lần tìm kiếm).

1import time
2import random
3base_url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
4all_results = []
5for page_num in range(17):  # Tối đa ~17 trang
6    offset = page_num * 18
7    paginated_url = f"{base_url}&items_offset={offset}"
8    # ... điều hướng và thu thập dữ liệu như trên ...
9    time.sleep(random.uniform(3, 7))  # Tạm dừng ngẫu nhiên giữa các trang

Cách thu thập giá Airbnb bằng Python (giải quyết vấn đề giá phụ thuộc ngày)

Đây là phần mà đa số hướng dẫn bỏ qua — nhưng lại là phần quan trọng nhất cho phân tích giá.

Vì sao Airbnb không hiện giá nếu không có ngày

Khoảng 90% thời gian, Airbnb yêu cầu ngày nhận/trả phòng trước khi hiển thị giá thật. Nếu không có ngày, bạn chỉ nhận được một khoảng “giá mỗi đêm” mơ hồ (hoặc đôi khi không có giá nào cả). Như : “Nếu một tin đăng không hiển thị giá (ví dụ khi Airbnb muốn bạn điều chỉnh ngày hoặc số khách), hàm sẽ chỉ trả về None.”

Tin tốt: tính đến tháng 4/2025, Airbnb hiện cho tất cả khách trên toàn cầu (đã bao gồm mọi loại phí trước thuế). Trước đây có một công tắc “Hiển thị tổng giá” — gần 17 triệu khách đã dùng nó trước khi nó trở thành mặc định.

Truyền ngày qua tham số URL

Luôn thêm checkincheckout vào URL tìm kiếm của bạn:

1https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2

Điều này kích hoạt Airbnb trả về giá thực tế theo đêm và tổng giá trong trang cũng như trong phản hồi API.

Lặp qua các khoảng ngày để phân tích giá

Dành cho chủ nhà và nhà đầu tư cần dữ liệu giá theo mùa:

1from datetime import datetime, timedelta
2start_date = datetime(2025, 7, 1)
3end_date = datetime(2025, 12, 31)
4stay_length = 2  # đêm
5current = start_date
6date_ranges = []
7while current + timedelta(days=stay_length) <= end_date:
8    checkin = current.strftime("%Y-%m-%d")
9    checkout = (current + timedelta(days=stay_length)).strftime("%Y-%m-%d")
10    date_ranges.append((checkin, checkout))
11    current += timedelta(days=7)  # Mỗi tuần một lần
12for checkin, checkout in date_ranges:
13    url = f"https://www.airbnb.com/s/Austin--TX/homes?checkin={checkin}&checkout={checkout}&adults=2"
14    # ... thu thập dữ liệu giá ...
15    time.sleep(random.uniform(5, 10))  # Tạm dừng hợp lý

Khi phân tích giá từ phản hồi API GraphQL, hãy tìm đối tượng pricingQuote, trong đó có price.total, price.priceItems (các khoản riêng lẻ như phí dọn dẹp, phí dịch vụ) và rate.amount (giá theo đêm).

Làm cho scraper Airbnb viết bằng Python sống sót sau các lần thiết kế lại website

Đây là phần bảo trì mà không ai muốn viết — nhưng có lẽ lại là phần quan trọng nhất trong bất kỳ dự án thu thập dữ liệu Airbnb nào.

Bộ chọn dễ vỡ vs. bộ chọn bền vững

Chiến lược bộ chọnRủi ro hỏngCông sức codeVí dụ
Tên lớp CSS (ví dụ .t1jojoys)🔴 Cao — thay đổi thường xuyênThấpsoup.select('.t1jojoys')
Thuộc tính data-testid🟡 Trung bình — ổn định hơnThấpsoup.select('[data-testid="listing-card-title"]')
Microdata Schema.org trong HTML🟢 Thấp — tiêu chuẩn cấu trúcTrung bìnhsoup.find("meta", itemprop="name")
Chặn API GraphQL🟢 Thấp — JSON có cấu trúcTrung bìnhresponse.json()["data"]["presentation"]
Trích xuất bằng AI (Thunderbit)🟢 Không — tự thích ứngKhôngGiao diện 2 cú nhấp, không cần code

Dùng thuộc tính data-testid

Các giá trị data-testid đã được ghi nhận trên Airbnb hiện gồm card-container, listing-card-title, listing-card-subtitlelisting-card-name. Những thuộc tính này gắn với framework kiểm thử nội bộ của Airbnb, không phải với kiểu hiển thị, nên ít thay đổi hơn lớp CSS. Tuy vậy, chúng vẫn có thể đổi — chỉ là ít thường xuyên hơn.

1# Bền vững hơn so với bộ chọn dựa trên lớp CSS
2title = await page.query_selector('[data-testid="listing-card-title"]')

Dùng microdata Schema.org

Airbnb dùng trực tiếp các thuộc tính itemprop trong HTML. Đây là tiêu chuẩn web nên ít thay đổi hơn nhiều so với các lớp CSS hiển thị:

1# Trích xuất tất cả mục tin đăng bằng đánh dấu schema.org
2listings = soup.find_all("div", itemprop="itemListElement")
3for listing in listings:
4    name = listing.find("meta", itemprop="name")["content"]
5    url = listing.find("meta", itemprop="url")["content"]

Chặn API GraphQL

Cách DIY đáng tin cậy nhất. API nội bộ của Airbnb trả về JSON sạch, được cấu trúc cho frontend tiêu thụ. Định dạng phản hồi thay đổi ít hơn DOM vì chính đội frontend cũng phụ thuộc vào nó.

Vì sao trích xuất bằng AI xóa bỏ hoàn toàn nhu cầu bảo trì

Ngay cả chiến lược bộ chọn tốt nhất rồi cũng sẽ hỏng. Các giá trị data-testid bị đổi tên. Cấu trúc phản hồi API bị version hóa. Cách duy nhất thực sự loại bỏ bảo trì là dùng AI để đọc lại trang từ đầu mỗi lần — không hề có bộ chọn cứng nào cả. Phần Thunderbit bên dưới sẽ nói rõ hơn.

Cách tránh bị chặn khi thu thập dữ liệu Airbnb

Các mẹo thực tế từ kinh nghiệm và sự đồng thuận của cộng đồng.

Xoay vòng proxy (bắt buộc phải dùng residential)

IP datacenter sẽ bị Airbnb chặn ngay. Proxy residential là bắt buộc nếu làm ở quy mô có ý nghĩa. Các nhà cung cấp hàng đầu theo hiệu năng và giá:

Nhà cung cấpGiá (mỗi GB)Tỷ lệ thành côngGhi chú
Decodo (trước đây là Smartproxy)~2,20 USD/GB ở mức 100GB99,68%Tốc độ đo được nhanh nhất (phản hồi 0,54s)
Bright Data~5,04 USD/GB ở mức 100GB99%+Pool lớn nhất, nhiều tính năng nhất
Oxylabs~4 USD/GB ở mức 100GB99%+Mạnh cho thương mại điện tử

Một lưu ý quan trọng từ một lập trình viên giàu kinh nghiệm: “Xoay IP mỗi request thực ra lại là dấu hiệu đáng ngờ. Người dùng thật thường giữ cùng một IP trong suốt một phiên.” Khuyến nghị là dùng session bám dính trong 5–10 phút, rồi xoay sau mỗi 20–30 request.

1proxies = {
2    "http": "http://user:pass@residential-proxy:port",
3    "https": "http://user:pass@residential-proxy:port",
4}
5response = cffi_requests.get(url, headers=headers, proxies=proxies, impersonate="chrome131")

Giới hạn tốc độ request của bạn

Mức an toàn theo đồng thuận cộng đồng:

  • Số trang tối đa mỗi giờ: ≤100 (~1,6/phút)
  • Độ trễ giữa các request: 3–10 giây (ngẫu nhiên, tốt nhất là phân phối Gaussian)
  • Nghỉ giữa phiên: Cứ 20 request thì nghỉ 30–60 giây
  • Khung giờ tối ưu: Ngoài giờ cao điểm (~2 giờ sáng theo giờ địa phương)
  • Khi gặp lỗi 429: Dùng chiến lược lùi thời gian theo cấp số nhân kèm jitter
1import random
2import time
3delay = random.gauss(5, 1.5)  # Trung bình 5 giây, độ lệch chuẩn 1,5
4delay = max(2, min(delay, 10))  # Giới hạn trong khoảng 2-10 giây
5time.sleep(delay)

Dùng header đầy đủ và nhất quán

Thiếu header Sec-Fetch-*. Mọi header phải nhất quán nội bộ — nếu User-Agent nói rằng bạn đang dùng Chrome 131 trên Windows, thì mọi header khác cũng phải khớp với danh tính đó.

1headers = {
2    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
3    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
4    "Accept-Language": "en-US,en;q=0.9",
5    "Accept-Encoding": "gzip, deflate, br",
6    "Sec-Fetch-Dest": "document",
7    "Sec-Fetch-Mode": "navigate",
8    "Sec-Fetch-Site": "none",
9    "Sec-Fetch-User": "?1",
10    "Sec-CH-UA": '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
11    "Sec-CH-UA-Platform": '"Windows"',
12}

Dùng trình duyệt headless cẩn thận

Với Playwright, gói playwright-stealth vá khoảng 17 module né phát hiện (navigator.webdriver, plugins, languages, WebGL). Nhưng hệ thống chống bot hiện đại kiểm tra hơn 40 thuộc tính, trong khi chỉ khoảng 12 thuộc tính được vá. Chạy ở chế độ không headless (headless=False) an toàn hơn nhưng chậm hơn.

Với Selenium, undetected-chromedriver vá binary ChromeDriver để loại bỏ các dấu hiệu tự động hóa, nhưng chế độ headless vẫn không ổn định.

Cân nhắc dùng API thu thập dữ liệu khi cần scale

Nếu bạn đang thu thập hàng nghìn trang, một API thu thập dữ liệu sẽ xử lý xoay proxy, giải CAPTCHA và render JavaScript giúp bạn. Trong , Bright Data đạt tỷ lệ thành công 99% với 48 trường dữ liệu mỗi tin đăng. Đánh đổi là chi phí — chế độ proxy ẩn danh của ScrapingBee tốn , nên gói 49 USD/tháng chỉ cho khoảng 3.333 request ẩn danh.

Thu thập dữ liệu Airbnb mà không cần Python: lựa chọn không cần code với Thunderbit

Không phải ai thu thập dữ liệu Airbnb cũng là lập trình viên. Chủ nhà muốn so sánh giá. Nhà đầu tư muốn dữ liệu thị trường. Nhà phân tích muốn một bảng tính. Nếu bạn đã đọc tới phần Python và nghĩ “cái này còn phải bảo trì nhiều hơn cả dự định của mình,” thì phần này dành cho bạn.

Thunderbit thu thập dữ liệu Airbnb chỉ trong vài cú nhấp

là một AI web scraper chạy dưới dạng . Quy trình như sau:

  1. Cài tiện ích mở rộng từ Chrome Web Store
  2. Mở trang kết quả tìm kiếm Airbnb — nhớ thêm ngày vào URL để giá chính xác hơn (ví dụ ?checkin=2025-08-01&checkout=2025-08-03)
  3. Nhấn “AI Suggest Fields” — Thunderbit quét trang và tự động phát hiện các cột như tên tin đăng, giá, xếp hạng, vị trí và URL
  4. Nhấn “Scrape” — dữ liệu sẽ được đổ vào một bảng có cấu trúc
  5. Dùng “Scrape Subpages” để vào từng trang chi tiết tin đăng và lấy tiện nghi, đánh giá, thông tin chủ nhà và chi tiết giá đầy đủ — không cần cấu hình thêm
  6. Xuất dữ liệu sang Google Sheets, Excel, Airtable hoặc Notion

Tính năng scrape trang con rất quan trọng ở đây. Với các cách bằng Python, việc thu thập trang chi tiết đồng nghĩa phải viết logic phân tích riêng, xử lý phân trang trong phần đánh giá và quản lý request song song. Với Thunderbit, chỉ cần một cú nhấp.

Vì sao Thunderbit giải quyết 3 vấn đề lớn nhất khi thu thập dữ liệu Airbnb

Ba vấn đề tôi mô tả ở trên — chống bot, render JavaScript và DOM dễ vỡ — chính là lý do scraper Python có chi phí bảo trì cao. Thunderbit giải quyết cả ba:

  • Không lo bị chặn IP: Chế độ Cloud Scraping của Thunderbit xử lý xoay proxy bên trong
  • Không vỡ bộ chọn: AI đọc lại trang mỗi lần — không có CSS selector nào phải bảo trì, không có code nào phải sửa khi Airbnb thiết kế lại
  • Không đau đầu thiết lập: Không cần driver Selenium, không cần môi trường Python, không xung đột dependency
  • Thu thập theo lịch: Mô tả khoảng thời gian bằng ngôn ngữ tự nhiên để theo dõi giá liên tục — rất phù hợp cho các trường hợp định giá động và bám sát đối thủ

Khi nào nên dùng Python, khi nào nên dùng Thunderbit

Đây không phải là câu hỏi hoặc cái này hoặc cái kia — nó phụ thuộc vào nhu cầu của bạn:

Nhu cầuPythonThunderbit
Toàn quyền kiểm soát logic thu thập✅ Có❌ Không
Dùng được dù không biết code❌ Không✅ Có
Tự động xử lý thay đổi DOM❌ Không✅ Có (dựa trên AI)
Thu thập trang con (trang chi tiết)Thiết lập phức tạp1 cú nhấp
Thu thập theo lịch/định kỳCron job tùy chỉnhCó sẵn bộ lập lịch
Xuất sang Sheets/Excel/AirtableCode thủ côngCó sẵn
Tích hợp vào pipeline dữ liệu✅ CóHạn chế
Chi phí khi scale lớn (10K+ trang)Chi phí server + proxyBảng giá Thunderbit

Nếu bạn cần kiểm soát ở cấp code, logic tùy chỉnh hoặc tích hợp vào pipeline dữ liệu hiện có, hãy dùng Python. Nếu bạn cần dữ liệu thật nhanh mà không phải bảo trì, Thunderbit là lựa chọn thực tế hơn.

Mẹo pháp lý và đạo đức khi thu thập dữ liệu Airbnb

Phần này ngắn gọn và thực dụng — tôi không phải luật sư, và đây không phải lời khuyên pháp lý.

Luật pháp nói gì (ở mức khái quát):

  • Phán quyết cho thấy việc thu thập dữ liệu công khai từ các website không yêu cầu xác thực không vi phạm CFAA
  • (tháng 1/2024): một thẩm phán cho rằng Điều khoản Dịch vụ không ràng buộc các scraper không đăng nhập
  • Vụ (2025) đưa ra một lập luận mới rằng việc vượt qua CAPTCHA và giới hạn tốc độ có thể vi phạm các điều khoản chống lách DMCA — điều này vẫn chưa được kiểm chứng nhưng đáng theo dõi

Airbnb nói gì: của họ cấm rõ ràng việc thu thập dữ liệu tự động. Tuy nhiên, Airbnb chưa từng công khai kiện một scraper nào. đã hoạt động hơn 11 năm mà không bị thách thức pháp lý, dù Airbnb từng gọi nó là “rác.”

Nguyên tắc thực tế:

  • Chỉ thu thập dữ liệu công khai (không vượt qua cổng đăng nhập)
  • Tôn trọng hướng dẫn robots.txt
  • Không làm quá tải máy chủ bằng tốc độ request quá cao
  • Xử lý dữ liệu cá nhân cẩn thận theo GDPR/CCPA
  • Với mục đích thương mại, hãy tham khảo tư vấn pháp lý

Kết luận và điểm rút ra chính

Thu thập dữ liệu Airbnb trải dài từ mức “nhanh và tạm bợ” đến “chuẩn production”. Các điểm chính:

  1. Luôn truyền ngày trong URL (checkincheckout) — nếu không có chúng, dữ liệu giá gần như vô dụng
  2. Đừng dựa vào tên lớp CSS. Hãy dùng thuộc tính data-testid, microdata schema.org hoặc chặn API GraphQL
  3. Proxy residential là bắt buộc ở quy mô lớn. IP datacenter bị chặn ngay lập tức
  4. Giới hạn tốc độ request — chờ ngẫu nhiên 3–10 giây, dùng session bám dính và lùi thời gian theo cấp số nhân khi lỗi
  5. Để thu thập không cần bảo trì, các công cụ AI như loại bỏ hoàn toàn vấn đề vỡ bộ chọn — chính vấn đề khiến scraper Python tốn kém để bảo trì
  6. Chọn công cụ phù hợp với dự án. Nghiên cứu nhanh? pyairbnb. Phân tích giá động? Playwright kèm chặn API. Theo dõi liên tục không cần code? Thunderbit. Quy mô production? Dùng API thu thập dữ liệu.

Nếu bạn muốn thử cách không cần code, — bạn có thể thử trên vài trang tìm kiếm Airbnb chỉ trong khoảng hai phút. Với cách dùng Python, toàn bộ mẫu code trong bài này đều đã sẵn sàng để bạn tùy biến theo nhu cầu cụ thể.

Để tìm hiểu thêm về các cách tiếp cận và công cụ thu thập dữ liệu web, hãy xem các hướng dẫn của chúng tôi về , . Bạn cũng có thể xem video hướng dẫn trên .

Câu hỏi thường gặp

Airbnb có thể chặn bạn vì thu thập dữ liệu không?

Có. Airbnb dùng Akamai Bot Manager với dấu vân tay TLS, thử thách JavaScript, dấu vân tay trình duyệt và chấm điểm uy tín IP. Bạn sẽ nhận phản hồi 403, 429 hoặc CAPTCHA nếu bị phát hiện. Xoay proxy, dùng header giống người dùng thật và giới hạn tốc độ request sẽ giảm rủi ro, nhưng không có cách nào đảm bảo tránh bị phát hiện nếu khối lượng quá lớn.

Thu thập dữ liệu Airbnb có hợp pháp không?

Thu thập dữ liệu công khai nhìn chung được phép theo án lệ ở Mỹ (hiQ v. LinkedIn, Meta v. Bright Data), nhưng Điều khoản Dịch vụ của Airbnb lại cấm rõ ràng. Khung pháp lý khác nhau tùy khu vực, và lý thuyết chống lách DMCA mới nổi (Reddit v. Perplexity) có thể ảnh hưởng tới các scraper vượt qua biện pháp chống bot. Với mục đích thương mại, hãy tham khảo tư vấn pháp lý.

Bạn có thể thu thập dữ liệu gì từ Airbnb?

Từ trang kết quả tìm kiếm: tên tin đăng, giá (khi có ngày), xếp hạng, số lượt đánh giá, vị trí, loại bất động sản và URL. Từ trang chi tiết: mô tả đầy đủ, tiện nghi, thông tin chủ nhà, toàn bộ đánh giá, ảnh, tình trạng trống của lịch, phí dọn dẹp và chi tiết giá. Độ sâu phụ thuộc vào việc bạn chỉ thu thập trang tìm kiếm hay còn vào từng trang tin đăng riêng.

Tôi có cần proxy để thu thập Airbnb bằng Python không?

Với vài trang, bạn có thể thử không dùng proxy. Nhưng nếu vượt quá 20–30 request, nên dùng proxy residential xoay vòng. IP datacenter sẽ bị chặn ngay. Đồng thuận cộng đồng cho rằng mỗi IP chỉ nên xử lý tối đa khoảng 100 trang mỗi giờ, với độ trễ ngẫu nhiên 3–10 giây giữa các request.

Cách dễ nhất để thu thập Airbnb mà không cần code là gì?

cho phép bạn thu thập kết quả tìm kiếm và trang chi tiết Airbnb bằng phát hiện trường dữ liệu dựa trên AI — không cần cấu hình bộ chọn, không cần viết code. Nó hỗ trợ thu thập trang con (tiện nghi, đánh giá và thông tin chủ nhà), xuất sang Google Sheets, Excel, Airtable hoặc Notion, và có thể thu thập theo lịch để theo dõi giá liên tục.

Tìm hiểu thêm

Fawad Khan
Fawad Khan
Fawad sống bằng nghề viết, và nói thật là anh ấy khá yêu công việc này. Anh đã dành nhiều năm để tìm hiểu điều gì khiến một câu chữ in đậm trong tâm trí người đọc — và điều gì khiến họ lướt qua. Hỏi anh về marketing, anh có thể nói hàng giờ. Hỏi anh về carbonara, anh sẽ nói còn lâu hơn.
Mục lục

Thử Thunderbit

Trích xuất lead và dữ liệu khác chỉ trong 2 cú nhấp. Powered by AI.

Nhận Thunderbit Miễn phí
Trích xuất dữ liệu bằng AI
Dễ dàng chuyển dữ liệu sang Google Sheets, Airtable hoặc Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week