A Step-by-Step Python Selenium Web Scraping Tutorial

Cập nhật lần cuối vào May 6, 2026
Step-by-step Python Selenium web scraping tutorial title slide with coding and web icons

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?

selenium-dynamic-vs-static-web-scraping.png 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ướcBạn làm gìVì sao quan trọng
1. Thiết lập môi trườngCài Selenium, WebDriver và các thư viện PythonChuẩ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ệuLấy văn bản, liên kết hoặc bảng và lưu ra CSV/ExcelBiế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ất
  • By.CLASS_NAME: Tìm phần tử theo class CSS
  • By.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?

selenium-vs-traditional-scrapers-comparison.png 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 choXử lý JavaScript?Tốc độ & mức dùng tài nguyên
SeleniumTrang động/tương tácChậm hơn, tốn bộ nhớ hơn
BeautifulSoupThu thập HTML tĩnh đơn giảnKhôngRất nhanh, nhẹ
ScrapyThu thập số lượng lớn từ site tĩnhHạn chế*Rất nhanh, bất đồng bộ, ít RAM
ThunderbitThu thập không cần code, phục vụ doanh nghiệpCó (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:

  1. Dùng Selenium để thu thập danh sách URL và tiêu đề sản phẩm.
  2. Xuất dữ liệu ra CSV.
  3. Mở Thunderbit, nhập CSV của bạn và để AI gợi ý trường dữ liệu.
  4. 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.
  5. 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ĩaCách khắc phục
NoSuchElementExceptionKhông tìm thấy phần tửKiểm tra lại bộ định vị; dùng wait
Lỗi timeoutTrang hoặc phần tử mất quá nhiều thời gianTăng thời gian chờ; kiểm tra tốc độ mạng
Driver/trình duyệt không khớpSelenium không thể khởi chạy trình duyệtCập nhật phiên bản driver và trình duyệt
Phiên bị sậpTrì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

Shuai Guan
Shuai Guan
CEO tại Thunderbit | Chuyên gia Tự động hóa Dữ liệu AI Shuai Guan là CEO của Thunderbit và là cựu sinh viên ngành Kỹ thuật của University of Michigan. Với gần một thập kỷ kinh nghiệm trong lĩnh vực công nghệ và kiến trúc SaaS, anh chuyên biến các mô hình AI phức tạp thành những công cụ trích xuất dữ liệu thực tiễn, không cần viết mã. Trên blog này, anh chia sẻ những góc nhìn thẳng thắn, đã được kiểm chứng qua thực chiến về web scraping và các chiến lược tự động hóa, giúp bạn xây dựng quy trình làm việc thông minh hơn, dựa trên dữ liệu. Khi không tối ưu hóa quy trình dữ liệu, anh áp dụng sự tỉ mỉ đó vào niềm đam mê nhiếp ảnh.
Topics
Scraping with seleniumSelenium web scraping tutorialPython selenium scrape website
Mục lục

Cào một trang web chỉ bằng cách hỏi

Nói bạn cần gì bằng tiếng Anh đơn giản. Hoặc tốt hơn, không cần nói gì cả.

Dùng Thunderbit ngay 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