CodeGym /Các khóa học /Python SELF VI /Các phương pháp chính để duyệt nhiều trang

Các phương pháp chính để duyệt nhiều trang

Python SELF VI
Mức độ , Bài học
Có sẵn

1. Sử dụng nút "Tiếp theo"

Nếu trên trang web có nút hoặc liên kết "Tiếp theo" để chuyển sang trang tiếp theo, bạn có thể thiết lập một vòng lặp để thực hiện hành động nhấp vào nút này cho đến khi nó không còn khả dụng.

Ví dụ mã

Python

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
import time

def initialize_driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    return driver

def open_page(driver, url):
    driver.get(url)

def collect_data(driver):
    # Ví dụ thu thập dữ liệu từ trang hiện tại
    items = driver.find_elements(By.CLASS_NAME, "item_class")
    for item in items:
        print(item.text)  # Tại đây bạn có thể lưu hoặc xử lý dữ liệu
    
def click_next_button(driver):
    try:
        next_button = driver.find_element(By.LINK_TEXT, "Next")
        next_button.click()
        return True
    except NoSuchElementException:
        return False  # Nút không được tìm thấy, có nghĩa là chúng ta đang ở trang cuối cùng

def main():
    driver = initialize_driver()
    open_page(driver, "https://example.com/page1")

    try:
        while True:
            collect_data(driver)
            if not click_next_button(driver):
                break  # Thoát khỏi vòng lặp nếu nút "Next" không tồn tại
            time.sleep(2)  # Chờ để tải trang tiếp theo
    finally:
        driver.quit()

main()

Giải thích mã

initialize_driver() — khởi tạo driver.
open_page() — mở trang đầu tiên để bắt đầu công việc.
collect_data() — hàm thu thập dữ liệu từ trang hiện tại.
click_next_button() — hàm tìm và nhấp vào nút "Next". Nếu nút không tồn tại, trả về False, nghĩa là hoàn thành việc duyệt.
Vòng lặp trong main() — vòng chính để duyệt qua các trang. Nó dừng lại khi nút "Next" không còn được tìm thấy.

2. Pagination bằng cách sử dụng số trang

Trên một số trang web, có các liên kết đánh số trang (ví dụ: "1", "2", "3", v.v.). Trong trường hợp này, bạn có thể tập hợp danh sách các liên kết và lần lượt truy cập từng liên kết.

Ví dụ mã

Python

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

def initialize_driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    return driver

def open_page(driver, url):
    driver.get(url)

def collect_data(driver):
    items = driver.find_elements(By.CLASS_NAME, "item_class")
    for item in items:
        print(item.text)

def go_to_page(driver, page_number):
    page_link = driver.find_element(By.LINK_TEXT, str(page_number))
    page_link.click()

def main():
    driver = initialize_driver()
    open_page(driver, "https://example.com/page1")

    try:
        total_pages = 5  # Chỉ định tổng số trang nếu biết
        for page in range(1, total_pages + 1):
            collect_data(driver)
            if page < total_pages:  # Không chuyển đến trang tiếp theo sau trang cuối cùng
                go_to_page(driver, page + 1)
                time.sleep(2)  # Chờ để tải trang tiếp theo
    finally:
        driver.quit()

main()

Giải thích mã

go_to_page() — hàm tìm liên kết đến trang mong muốn theo số của nó và chuyển đến trang đó.
Vòng lặp trong main() — sử dụng biến total_pages để xác định số lượng trang. Vòng lặp chuyển đến trang tiếp theo cho đến khi đạt đến trang cuối cùng.

3. Thay đổi URL cho mỗi trang

Một số trang web có cấu trúc URL đơn giản, nơi mỗi trang được nhận dạng bằng số trong URL, ví dụ như: https://example.com/page/1, https://example.com/page/2, v.v. Trong trường hợp này, bạn có thể chỉ cần thay đổi URL và tải trang mong muốn, tránh cần phải tìm kiếm các phần tử.

Ví dụ mã

Python

from selenium import webdriver
import time

def initialize_driver():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    return driver

def open_page(driver, url):
    driver.get(url)

def collect_data(driver):
    items = driver.find_elements_by_class_name("item_class")
    for item in items:
        print(item.text)

def main():
    driver = initialize_driver()

    try:
        total_pages = 5  # Chỉ định tổng số trang nếu biết
        base_url = "https://example.com/page/"
        
        for page_number in range(1, total_pages + 1):
            url = f"{base_url}{page_number}"
            open_page(driver, url)
            collect_data(driver)
            time.sleep(2)  # Chờ để tải trang tiếp theo
    finally:
        driver.quit()

main()

Giải thích mã

Biến base_url chứa URL cơ bản của trang. Vòng lặp bổ sung nó với số trang và lần lượt mở từng trang.
Vòng lặp tạo URL của từng trang và thực hiện việc thu thập dữ liệu mà không cần nhấp vào các phần tử. Điều này giảm thiểu khả năng xảy ra lỗi.

4. Mẹo tối ưu hóa

  • Giảm thiểu thời gian chờ và nhấp vào các yếu tố động: Sử dụng liên kết và URL bền vững hơn so với nhấp vào các nút được tải bằng JavaScript.
  • Sử dụng bộ hẹn giờ chờ với thời gian ngắn: Khi chuyển sang trang mới, hãy sử dụng độ trễ nhỏ time.sleep(2), để các phần tử có thời gian tải, nhưng đừng chờ lâu hơn cần thiết.
  • Thu thập dữ liệu sau khi trang đã tải hoàn toàn: Đảm bảo rằng dữ liệu trên trang được tải đầy đủ trước khi bắt đầu thu thập. Sử dụng implicitly_wait để đảm bảo phát hiện các phần tử một cách đáng tin cậy.
  • Ghi nhật ký: Thêm ghi nhật ký để ghi nhận trang hiện tại, lỗi và các chuyển đổi thành công. Điều này sẽ giúp đơn giản hóa việc chẩn đoán khi chạy script.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION