Web ngày nay không còn như trước nữa. Giờ đây, gần như mọi trang bạn truy cập đều chạy bằng JavaScript, tải nội dung động theo thời gian thực—hãy nghĩ đến cuộn vô hạn, pop-up và các bảng điều khiển chỉ hé lộ “bí mật” sau một hoặc hai cú nhấp chuột. Thực tế, có tới 98,7% website hiện nay dùng JavaScript, nghĩa là các công cụ thu thập dữ liệu kiểu cũ chỉ đọc HTML tĩnh sẽ bỏ lỡ rất nhiều dữ liệu giá trị. Nếu bạn từng cố thu thập giá sản phẩm từ một trang thương mại điện tử hiện đại hoặc lấy danh sách bất động sản từ một bản đồ tương tác, chắc bạn hiểu cảm giác bực bội này: dữ liệu bạn cần פשוט không nằm trong mã nguồn.
Đó là lúc thu thập dữ liệu bằng Selenium phát huy tác dụng. Là người đã dành nhiều năm xây dựng các công cụ tự động hóa (và đúng vậy, cũng đã “cào” dữ liệu từ không ít website), tôi có thể nói với bạn rằng: làm chủ Selenium là một siêu năng lực cho bất kỳ ai cần dữ liệu động, cập nhật liên tục. Trong hướng dẫn thu thập dữ liệu web bằng Selenium thực hành này, tôi sẽ dẫn bạn qua các bước quan trọng—từ thiết lập đến tự động hóa—và chỉ cho bạn cách kết hợp Selenium với Thunderbit để xuất dữ liệu có cấu trúc, sẵn sàng đưa ra ngoài. Dù bạn là nhà phân tích kinh doanh, chuyên viên bán hàng hay chỉ là một người dùng Python tò mò, bạn sẽ ra về với những kỹ năng thực tế và vài tiếng cười (vì nói thật đi, gỡ lỗi selector XPath cũng là một cách rèn tính kiên nhẫn).
Dùng thử AI Web Scraper của Thunderbit
Selenium là gì và vì sao nên dùng để thu thập dữ liệu web?
Hãy bắt đầu từ nền tảng. Selenium là một framework mã nguồn mở cho phép bạn điều khiển một trình duyệt web thật—như Chrome hoặc Firefox—bằng mã lệnh. Hãy hình dung nó như một con robot có thể mở trang, nhấp nút, điền biểu mẫu, cuộn trang, và thậm chí chạy JavaScript, hệt như một người dùng thật. Điều này rất quan trọng vì phần lớn website hiện đại không hiển thị toàn bộ dữ liệu ngay từ đầu. Thay vào đó, chúng tải nội dung động, thường là sau khi bạn tương tác với trang.
Thu thập dữ liệu là gì và làm thế nào trong năm 2026 Get Started Free
Vì sao điều này quan trọng khi thu thập dữ liệu? Các công cụ truyền thống như BeautifulSoup hay Scrapy rất tốt cho HTML tĩnh, nhưng chúng không thể “nhìn thấy” những thứ được JavaScript tải sau khi trang vừa mở. Selenium thì ngược lại: có thể tương tác với trang theo thời gian thực, nên đặc biệt phù hợp để:
- Thu thập danh sách sản phẩm chỉ hiện ra sau khi bấm “Tải thêm”
- Lấy giá hoặc đánh giá được cập nhật động
- Điều hướng qua biểu mẫu đăng nhập, pop-up hoặc cuộn vô hạn
- Trích xuất dữ liệu từ dashboard, bản đồ hoặc các phần tử tương tác khác
Tóm lại, Selenium là công cụ bạn nên dùng khi cần thu thập dữ liệu chỉ xuất hiện sau khi trang tải xong—hoặc sau một hành động của người dùng.
Các bước chính để thu thập dữ liệu web bằng Python Selenium
Thu thập dữ liệu với Selenium quy về ba bước cốt lõi:
| Bước | Bạn làm gì | Vì sao quan trọng |
|---|---|---|
| 1. Thiết lập môi trường | Cài Selenium, WebDriver và các thư viện Python | Chuẩn bị công cụ sẵn sàng và tránh rắc rối khi cài đặt |
| 2. Xác định phần tử | Tìm dữ liệu cần lấy bằng ID, class, XPath, v.v. | Nhắm đúng thông tin, kể cả khi nó bị JavaScript ẩn đi |
| 3. Trích xuất & lưu dữ liệu | Lấy văn bản, liên kết hoặc bảng và lưu ra CSV/Excel | Biến dữ liệu web thô thành thứ bạn có thể sử dụng |
Hãy đi sâu vào từng bước với các ví dụ thực tế và đoạn mã mà bạn có thể copy, chỉnh sửa và khoe với bạn bè.
Bước 1: Thiết lập môi trường Python Selenium của bạn
Việc đầu tiên: bạn cần cài Selenium và một trình điều khiển trình duyệt (như ChromeDriver cho Chrome). Tin tốt là: bây giờ dễ hơn bao giờ hết.
Cài Selenium
Mở terminal và chạy:
pip install selenium
Lấy WebDriver
- Chrome: Tải ChromeDriver (đảm bảo khớp với phiên bản Chrome của bạn).
- Firefox: Tải GeckoDriver.
Mẹo hay: Từ Selenium 4.6+, bạn có thể dùng Selenium Manager để tự động tải driver, nên có khi bạn chẳng cần phải đụng đến biến PATH nữa (tài liệu).
Script Selenium đầu tiên của bạn
Đây là một ví dụ “hello world” nhanh cho Selenium:
from selenium import webdriver
driver = webdriver.Chrome() # Hoặc webdriver.Firefox()
driver.get("https://example.com")
print(driver.title)
driver.quit()
Mẹo xử lý lỗi:
- Nếu bạn gặp lỗi “driver not found”, hãy kiểm tra PATH hoặc dùng Selenium Manager.
- Đảm bảo phiên bản trình duyệt và driver khớp nhau.
- Nếu bạn đang chạy trên máy chủ headless (không có GUI), hãy xem các mẹo về chế độ headless bên dưới.
Bước 2: Xác định phần tử web để trích xuất dữ liệu
Giờ đến phần thú vị: nói cho Selenium biết bạn muốn lấy dữ liệu nào. Website được xây dựng từ các phần tử—div, span, table, đủ kiểu—và Selenium cho bạn nhiều cách để tìm chúng.
Các chiến lược định vị phổ biến
By.ID: Tìm phần tử có ID duy nhấtBy.CLASS_NAME: Tìm phần tử theo class CSSBy.XPATH: Dùng biểu thức XPath (rất linh hoạt, nhưng có thể dễ hỏng)By.CSS_SELECTOR: Dùng selector CSS (rất tốt cho truy vấn phức tạp)
Bạn có thể dùng chúng như sau:
from selenium.webdriver.common.by import By
# Tìm theo ID
price = driver.find_element(By.ID, "price").text
# Tìm theo XPath
title = driver.find_element(By.XPATH, "//h1").text
# Tìm tất cả ảnh sản phẩm bằng CSS selector
images = driver.find_elements(By.CSS_SELECTOR, ".product img")
for img in images:
print(img.get_attribute("src"))
Mẹo hay: Luôn dùng bộ định vị đơn giản và ổn định nhất (ID > class > CSS > XPath). Và nếu bạn thu thập một trang tải dữ liệu sau độ trễ, hãy dùng explicit wait:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
price_elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".price")))
Cách này giúp script của bạn không bị sập chỉ vì dữ liệu xuất hiện chậm hơn một chút.
Bước 3: Trích xuất và lưu dữ liệu
Sau khi đã tìm được các phần tử, đến lúc lấy dữ liệu và lưu nó vào nơi hữu ích.
Trích xuất văn bản, liên kết và bảng
Giả sử bạn đang thu thập một bảng sản phẩm:
data = []
rows = driver.find_elements(By.XPATH, "//table/tbody/tr")
for row in rows:
cells = row.find_elements(By.TAG_NAME, "td")
data.append([cell.text for cell in cells])
Lưu ra CSV với Pandas
import pandas as pd
df = pd.DataFrame(data, columns=["Tên", "Giá", "Tồn kho"])
df.to_csv("products.csv", index=False)
Bạn cũng có thể lưu ra Excel (df.to_excel("products.xlsx")) hoặc thậm chí đẩy lên Google Sheets bằng API của họ.
Ví dụ đầy đủ: Thu thập tiêu đề và giá sản phẩm
from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
driver = webdriver.Chrome()
driver.get("https://example.com/products")
data = []
products = driver.find_elements(By.CLASS_NAME, "product-card")
for p in products:
title = p.find_element(By.CLASS_NAME, "title").text
price = p.find_element(By.CLASS_NAME, "price").text
data.append([title, price])
driver.quit()
df = pd.DataFrame(data, columns=["Tiêu đề", "Giá"])
df.to_csv("products.csv", index=False)
Selenium so với BeautifulSoup và Scrapy: Điều gì làm Selenium khác biệt?
Hãy chốt tranh luận: khi nào nên dùng Selenium, và khi nào BeautifulSoup hoặc Scrapy phù hợp hơn? Dưới đây là so sánh nhanh:
| Công cụ | Phù hợp nhất cho | Xử lý JavaScript? | Tốc độ & mức dùng tài nguyên |
|---|---|---|---|
| Selenium | Trang động/tương tác | Có | Chậm hơn, tốn bộ nhớ hơn |
| BeautifulSoup | Thu thập HTML tĩnh đơn giản | Không | Rất nhanh, nhẹ |
| Scrapy | Thu thập số lượng lớn từ site tĩnh | Hạn chế* | Rất nhanh, bất đồng bộ, ít RAM |
| Thunderbit | Thu thập không cần code, phục vụ doanh nghiệp | Có (AI) | Nhanh cho tác vụ nhỏ/trung bình |
*Scrapy có thể xử lý một số nội dung động bằng plugin, nhưng đó không phải sở trường của nó (ScrapingBee).
Khi nên dùng Selenium:
- Dữ liệu chỉ hiện ra sau khi nhấp, cuộn hoặc đăng nhập
- Bạn cần tương tác với pop-up, cuộn vô hạn hoặc dashboard động
- Các công cụ thu thập tĩnh đơn giản là không đủ
Khi nên dùng BeautifulSoup/Scrapy:
- Dữ liệu nằm ngay trong HTML ban đầu
- Bạn cần thu thập hàng nghìn trang thật nhanh
- Bạn muốn dùng ít tài nguyên nhất có thể
Và nếu bạn muốn bỏ qua hoàn toàn việc viết code, Thunderbit cho phép bạn thu thập các site động bằng AI—chỉ cần bấm “AI Suggest Fields” rồi xuất sang Sheets, Notion hoặc Airtable. (Sẽ nói kỹ hơn bên dưới.)
Cách thu thập bất kỳ website nào bằng AI Get Started Free
Tự động hóa các tác vụ thu thập dữ liệu web với Selenium và Python
Nói thật nhé: không ai muốn thức dậy lúc 2 giờ sáng chỉ để chạy một script thu thập dữ liệu. Tin tốt là bạn có thể tự động hóa các job Selenium bằng công cụ lập lịch của Python hoặc bộ lập lịch của hệ điều hành (như cron trên Linux/Mac hoặc Task Scheduler trên Windows).
Dùng thư viện schedule
import schedule
import time
def job():
# Mã thu thập dữ liệu của bạn ở đây
print("Đang thu thập dữ liệu...")
schedule.every().day.at("09:00").do(job)
while True:
schedule.run_pending()
time.sleep(1)
Hoặc dùng Cron (Linux/Mac)
Thêm dòng này vào crontab để chạy mỗi giờ:
0 * * * * python /path/to/your_script.py
Mẹo cho tự động hóa:
- Chạy Selenium ở chế độ headless (xem bên dưới) để tránh pop-up giao diện.
- Ghi log lỗi và tự gửi cảnh báo nếu có sự cố.
- Luôn đóng trình duyệt bằng
driver.quit()để giải phóng tài nguyên.
Tăng hiệu quả: Mẹo thu thập dữ liệu bằng Selenium nhanh hơn và đáng tin cậy hơn
Selenium rất mạnh, nhưng nếu không cẩn thận thì có thể chậm và ngốn tài nguyên. Đây là cách tăng tốc và tránh các vấn đề thường gặp:
1. Chạy ở chế độ Headless
Không cần phải nhìn Chrome mở ra đóng vào cả trăm lần. Chế độ headless chạy trình duyệt ở nền:
from selenium.webdriver.chrome.options import Options
opts = Options()
opts.headless = True
driver = webdriver.Chrome(options=opts)
2. Chặn ảnh và nội dung không cần thiết
Nếu bạn chỉ thu thập văn bản, việc gì phải tải ảnh? Hãy chặn chúng để tăng tốc tải trang:
prefs = {"profile.managed_default_content_settings.images": 2}
opts.add_experimental_option("prefs", prefs)
3. Dùng bộ định vị hiệu quả
- Ưu tiên ID hoặc CSS selector đơn giản thay vì XPath phức tạp.
- Tránh dùng
time.sleep()—hãy dùng explicit wait (WebDriverWait) thay thế.
4. Thêm độ trễ ngẫu nhiên
Thêm các khoảng nghỉ ngẫu nhiên để mô phỏng hành vi duyệt web của con người và tránh bị chặn:
import random, time
time.sleep(random.uniform(1, 3))
5. Xoay vòng user agent và IP (nếu cần)
Nếu bạn thu thập nhiều, hãy thay đổi chuỗi user agent và cân nhắc dùng proxy để tránh các biện pháp chống bot đơn giản.
6. Quản lý phiên và lỗi
- Dùng khối try/except để xử lý phần tử bị thiếu một cách nhẹ nhàng.
- Ghi log lỗi và chụp ảnh màn hình để gỡ lỗi.
Để xem thêm mẹo tối ưu, hãy tham khảo hướng dẫn của BrowserStack.
Nâng cao: Kết hợp Selenium với Thunderbit để xuất dữ liệu có cấu trúc
Đây là phần thật sự thú vị—đặc biệt nếu bạn muốn tiết kiệm thời gian dọn dữ liệu và xuất kết quả.
Sau khi đã thu thập dữ liệu thô bằng Selenium, bạn có thể dùng Thunderbit để:
- Tự động nhận diện trường dữ liệu: AI của Thunderbit có thể đọc các trang hoặc file CSV bạn đã thu thập và gợi ý tên cột (“AI Suggest Fields”).
- Thu thập trang con: Nếu bạn có một danh sách URL (như các trang sản phẩm), Thunderbit có thể truy cập từng trang và bổ sung thêm chi tiết cho bảng của bạn—không cần thêm code.
- Làm giàu dữ liệu: Dịch, phân loại hoặc phân tích dữ liệu ngay lập tức.
- Xuất ở bất kỳ đâu: Chỉ một cú nhấp để xuất sang Google Sheets, Airtable, Notion, CSV hoặc Excel.
Ví dụ quy trình:
- Dùng Selenium để thu thập danh sách URL và tiêu đề sản phẩm.
- Xuất dữ liệu ra CSV.
- Mở Thunderbit, nhập CSV của bạn và để AI gợi ý trường dữ liệu.
- Dùng tính năng thu thập trang con của Thunderbit để lấy thêm chi tiết (như ảnh hoặc thông số kỹ thuật) từ từng URL sản phẩm.
- Xuất bộ dữ liệu cuối cùng, đã được cấu trúc, sang Sheets hoặc Notion.
Sự kết hợp này giúp tiết kiệm hàng giờ dọn dẹp thủ công và cho bạn tập trung vào phân tích thay vì loay hoay với dữ liệu lộn xộn. Để tìm hiểu sâu hơn về quy trình này, hãy xem hướng dẫn Selenium của Thunderbit.
Xuất dữ liệu Selenium với Thunderbit AI
Thực hành tốt nhất và xử lý lỗi cho thu thập dữ liệu web bằng Selenium
Thu thập dữ liệu web giống như câu cá: có lúc bạn bắt được con lớn, có lúc lại mắc vào cỏ dại. Đây là cách giữ script của bạn ổn định—và có đạo đức:
Thực hành tốt nhất
- Tôn trọng robots.txt và điều khoản của site: Luôn kiểm tra xem việc thu thập có được phép không.
- Giảm tần suất yêu cầu: Đừng làm quá tải máy chủ—hãy thêm độ trễ và để ý lỗi HTTP 429.
- Dùng API khi có thể: Nếu dữ liệu công khai qua API, hãy dùng nó—an toàn và ổn định hơn.
- Chỉ thu thập dữ liệu công khai: Tránh thông tin cá nhân hoặc nhạy cảm, và lưu ý các quy định về quyền riêng tư.
- Xử lý pop-up và CAPTCHA: Dùng Selenium để đóng pop-up, nhưng CAPTCHA thì khó tự động hóa hơn nhiều.
- Ngẫu nhiên hóa user agent và độ trễ: Giúp tránh bị phát hiện và chặn.
Lỗi thường gặp và cách khắc phục
| Lỗi | Ý nghĩa | Cách khắc phục |
|---|---|---|
NoSuchElementException | Không tìm thấy phần tử | Kiểm tra lại bộ định vị; dùng wait |
| Lỗi timeout | Trang hoặc phần tử mất quá nhiều thời gian | Tăng thời gian chờ; kiểm tra tốc độ mạng |
| Driver/trình duyệt không khớp | Selenium không thể khởi chạy trình duyệt | Cập nhật phiên bản driver và trình duyệt |
| Phiên bị sập | Trình duyệt đóng bất ngờ | Dùng chế độ headless; quản lý tài nguyên |
Để xem thêm mẹo xử lý sự cố, hãy đọc hướng dẫn Selenium của Thunderbit.
Kết luận & điểm chính cần nhớ
Thu thập dữ liệu web động không còn là sân chơi riêng của dân dev cứng nữa. Với Python Selenium, bạn có thể tự động hóa mọi trình duyệt, tương tác với những website JavaScript phức tạp nhất, và lấy đúng dữ liệu mà doanh nghiệp cần—dù là cho bán hàng, nghiên cứu hay chỉ để thỏa mãn sự tò mò của bạn. Hãy nhớ:
- Selenium là công cụ lý tưởng cho các site động, có tính tương tác.
- Ba bước quan trọng: thiết lập, xác định, trích xuất & lưu.
- Tự động hóa script để cập nhật dữ liệu đều đặn.
- Tối ưu tốc độ và độ tin cậy bằng headless mode, wait thông minh và bộ định vị hiệu quả.
- Kết hợp Selenium với Thunderbit để cấu trúc và xuất dữ liệu dễ dàng—đặc biệt nếu bạn muốn bỏ qua nỗi đau với bảng tính.
Sẵn sàng tự thử chưa? Hãy bắt đầu với các ví dụ mã ở trên, và khi bạn sẵn sàng nâng cấp việc thu thập dữ liệu của mình, hãy thử Thunderbit để dọn và xuất dữ liệu tức thì bằng AI. Và nếu bạn muốn đọc thêm, hãy xem Thunderbit Blog để có các bài phân tích chuyên sâu, hướng dẫn và tin mới nhất về tự động hóa web.
Chúc bạn thu thập dữ liệu vui vẻ—và mong các selector của bạn luôn tìm đúng thứ mình cần.
Dùng thử AI Web Scraper của Thunderbit miễn phí Get Started Free
Câu hỏi thường gặp
1. Vì sao nên dùng Selenium để thu thập dữ liệu web thay vì BeautifulSoup hoặc Scrapy?
Selenium lý tưởng cho các website động, nơi nội dung tải sau thao tác người dùng hoặc sau khi JavaScript chạy. BeautifulSoup và Scrapy nhanh hơn cho HTML tĩnh, nhưng không thể tương tác với phần tử động hay mô phỏng nhấp chuột và cuộn trang.
2. Làm thế nào để scraper Selenium chạy nhanh hơn?
Dùng chế độ headless, chặn ảnh và tài nguyên không cần thiết, dùng bộ định vị hiệu quả, và thêm độ trễ ngẫu nhiên để mô phỏng việc duyệt web của con người. Xem thêm hướng dẫn của BrowserStack để có thêm mẹo.
3. Tôi có thể lên lịch để các tác vụ thu thập bằng Selenium tự chạy không?
Có! Hãy dùng thư viện schedule của Python hoặc bộ lập lịch của hệ điều hành (cron hoặc Task Scheduler) để chạy script theo khoảng thời gian cố định. Tự động hóa sẽ giúp dữ liệu của bạn luôn được cập nhật.
4. Cách tốt nhất để xuất dữ liệu thu thập bằng Selenium là gì?
Dùng Pandas để lưu dữ liệu ra CSV hoặc Excel. Với các kiểu xuất nâng cao hơn (Google Sheets, Notion, Airtable), hãy nhập dữ liệu vào Thunderbit và dùng tính năng xuất một chạm.
5. Làm sao xử lý pop-up và CAPTCHA trong Selenium?
Bạn có thể đóng pop-up bằng cách tìm và nhấp nút đóng của chúng. CAPTCHA thì khó hơn nhiều—nếu gặp, hãy cân nhắc phương án thủ công hoặc dịch vụ giải CAPTCHA, và luôn tôn trọng điều khoản sử dụng của website.
Muốn xem thêm các hướng dẫn thu thập dữ liệu, mẹo tự động hóa bằng AI, hoặc cập nhật mới nhất về công cụ dữ liệu cho doanh nghiệp? Hãy đăng ký Thunderbit Blog hoặc xem kênh YouTube của chúng tôi để xem các demo thực hành.
Tìm hiểu thêm
- Bắt đầu với Selenium Python để thu thập dữ liệu web
- Beautiful Soup so với Selenium: So sánh chi tiết năm 2025
- Hướng dẫn toàn diện về thu thập dữ liệu web bằng Python: Từng bước một
- Hướng dẫn thu thập dữ liệu Python từng bước cho người mới bắt đầu
- Hướng dẫn từng bước: Thu thập dữ liệu web trong Python


