1. Chuẩn bị cho điều hướng
Trước khi bắt đầu cuộc hành trình vĩ đại của mình, chúng ta cần chuẩn bị dụng cụ phù hợp: Selenium và một chút khéo léo. Chúng tôi giả định rằng bạn đã biết cách cấu hình Selenium và driver cho trình duyệt, nên bắt đầu ngay thôi nào!
Cấu hình driver
from selenium import webdriver
# Chạy driver trình duyệt, ví dụ Chrome
driver = webdriver.Chrome()
# Mở trang đầu tiên của cuộc phiêu lưu
driver.get("http://example.com/start-page")
Tới giờ mọi thứ vẫn đơn giản — chúng ta đã mở trình duyệt và tải trang khởi đầu. Nhưng đây là lúc niềm vui bắt đầu: chúng ta không muốn chỉ dừng lại ở một trang. Chúng ta muốn ghé thăm từng người hàng xóm của nó!
2. Phân trang: đi qua các trang
Cách đơn giản nhất và thân thiện nhất để điều hướng giữa các trang là phân trang. Bạn đã thấy những con số nhỏ xinh ở cuối trang chưa? Chúng giống như những chỉ dẫn trên đường: «Điểm dừng tiếp theo của bạn — trang 2».
Thu thập dữ liệu từ các trang
Trước khi bắt đầu hành trình, chúng ta muốn thu thập thông tin từ trang hiện tại. Giả sử đó là danh sách sản phẩm hoặc tiêu đề bài viết.
def extract_data():
# Tìm tất cả các phần tử mà chúng ta quan tâm trên trang, ví dụ, tiêu đề
titles = driver.find_elements_by_class_name("item-title")
for title in titles:
print(title.text) # Đúng vậy, chúng ta chỉ in ra văn bản, nhưng bạn có thể lưu nó ở đâu đó
extract_data()
Nếu bạn đã bỏ qua những bài giảng trước, đoạn code này sẽ tìm tất cả tiêu đề có class là item-title và in chúng ra.
Đi đến trang tiếp theo
Bây giờ, khi đã có dữ liệu, đã đến lúc tiếp tục. Phân trang thường được trình bày dưới dạng nút có liên kết đến trang tiếp theo hoặc trước đó. Chúng ta cần tìm các nút này và nhấp vào chúng.
def go_to_next_page():
try:
# Tìm nút trang tiếp theo và nhấp vào nó
next_button = driver.find_element_by_link_text("Next")
next_button.click()
except NoSuchElementException:
# Nếu không có nút, nghĩa là đã đến cuối
print("Hết danh sách các trang.")
Hàm này tìm liên kết có văn bản «Next». Nếu tìm thấy, nó nhấp vào liên kết đó, chuyển sang trang kế tiếp. Nếu không, bot của chúng ta hiểu rằng đã đến cuối internet... ít nhất là chuỗi các trang này.
3. Lặp qua các trang
Chúng ta còn thiếu gì để đạt được hạnh phúc trọn vẹn? Đúng rồi, một vòng lặp! Hãy kết hợp tất cả điều này vào một vòng lặp duy nhất để bot của chúng ta có thể đi qua tất cả các trang có sẵn như một chuyên gia thực thụ.
while True:
extract_data() # Thu thập dữ liệu từ trang hiện tại
go_to_next_page() # Chuyển sang trang tiếp theo
time.sleep(2) # Nghỉ ngơi một chút để không làm phiền server
Xong, bây giờ bot của chúng ta sẽ dũng cảm đi qua tất cả các trang mà có thể nhấp nút «Next». Code này sẽ tiếp tục chạy cho đến khi hết trang. Hãy nhớ rằng một chút tạm dừng giữa các lần yêu cầu là cách bạn giữ tình bạn với server. Không ai thích spam, đặc biệt là admin của các trang web.
4. Tương tác động
Các bạn ơi, không phải lúc nào mọi thứ cũng đơn giản như trong các ví dụ về phân trang. Đôi khi trang xử lý giống như ninja khó nắm bắt, tải dữ liệu động khi cuộn. Nhưng không sao, chúng ta vẫn sẽ xử lý được.
Chờ rõ ràng
Kỳ vọng cho phép mã của bạn dừng lại một chút cho đến khi phần tử cần thiết xuất hiện. Điều này rất hữu ích khi nội dung không được tải ngay lập tức.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def wait_for_element(locator):
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, locator))
)
return element
except TimeoutException:
print("Không tìm thấy phần tử.")
Với hàm này, bot của bạn sẽ hòa hợp với các nội dung tải động, chờ đợi cho đến khi các phần tử có sẵn.
Cuộn trang
Với nội dung động nằm trên các trang kỳ diệu như cuộn vô tận, chúng ta có thể cần cuộn xuống dưới để tải thêm phần tử.
def scroll_down():
# Sử dụng JavaScript để cuộn xuống
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
Script JavaScript này giúp thực hiện cuộn mượt mà xuống dưới, cho phép trang tải nội dung. Bạn có thể sử dụng phương pháp này trong một vòng lặp để đi qua các trang cuộn vô tận.
5. Đặc điểm và mẹo
Đi xa hơn các ví dụ — đây là tập truyện phiêu lưu, đầy bất ngờ. Hãy tưởng tượng rằng bot của bạn, giống như bạn, cần sẵn sàng cho các kịch bản khác nhau.
Nếu không có nút «Next», nhưng có phân trang với các số trang, hãy sử dụng cách tiếp cận động bằng cách điền số trong URL trực tiếp. Và nếu trang web của bạn bất ngờ trở thành ninja và ẩn một số trang, hãy điều chỉnh script của bạn sao cho chúng có thể thích nghi, luôn sẵn sàng đối mặt với bất ngờ.
GO TO FULL VERSION