1. 使用「下一頁」按鈕
如果網站上有「下一頁」的按鈕或鏈結,可以設定一個迴圈,不斷點擊該按鈕直到它不可用為止。
程式碼範例
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):
# 從當前頁面收集數據的範例
items = driver.find_elements(By.CLASS_NAME, "item_class")
for item in items:
print(item.text) # 這裡可以儲存或處理數據
def click_next_button(driver):
try:
next_button = driver.find_element(By.LINK_TEXT, "Next")
next_button.click()
return True
except NoSuchElementException:
return False # 沒有找到按鈕,說明已經到最後一頁
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 # 如果「Next」按鈕不可用,退出迴圈
time.sleep(2) # 等待下一頁加載
finally:
driver.quit()
main()
程式碼解釋
initialize_driver() — 初始化 driver。
open_page() — 開啟第一頁開始工作。
collect_data() — 用於從當前頁面收集數據的函數。
click_next_button() — 找到並點擊 「Next」 按鈕的函數。如果按鈕缺失,返回 False,表示已完成頁面抓取。
main() 中的迴圈 — 處理頁面抓取的主要迴圈。在按鈕 「Next」 找不到後退出。
2. 使用頁碼進行分頁
一些網站上有頁碼鏈結,例如「1」、「2」、「3」等。在這種情況下,可以收集鏈結後依次跳轉。
程式碼範例
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 # 如果已知總頁數,請指定
for page in range(1, total_pages + 1):
collect_data(driver)
if page < total_pages: # 最後一頁之後不跳轉
go_to_page(driver, page + 1)
time.sleep(2) # 等待下一頁加載
finally:
driver.quit()
main()
程式碼解釋
go_to_page() — 用於根據頁碼找到對應鏈結並跳轉的函數。
main() 中的迴圈 — 使用變數 total_pages 指定頁數,並在每頁之間跳轉,直至完成所有頁面。
3. 修改每頁的 URL
某些網站的 URL 結構簡單,每頁由 URL 中的編號識別,例如, https://example.com/page/1, https://example.com/page/2 等。在這種情況下,可以直接修改 URL 以加載每頁,避免查找元素的步驟。
程式碼範例
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 # 如果已知總頁數,請指定
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) # 等待下一頁加載
finally:
driver.quit()
main()
程式碼解釋
變數 base_url 存儲頁面的基本 URL。 迴圈通過添加頁碼生成每頁的 URL,並依次加載每頁。
迴圈 生成每頁的 URL,並在不點擊元素的情況下收集數據, 最大限度地減少出錯概率。
4. 優化建議
- 減少對動態元素的等待和點擊:直接使用鏈結和 URL 會比點擊由 JavaScript 加載的按鈕更可靠。
- 使用短暫的等待時間:在加載新頁面時,使用
time.sleep(2)進行小幅延遲,讓元素完全加載,但不要等待過久。 - 在整頁加載後收集數據:確保頁面完全加載後再開始數據收集。使用
implicitly_wait來可靠地檢測元素。 - 日誌記錄:加入日誌功能以記錄當前頁面、錯誤、成功的跳轉操作。這樣有助於在執行腳本時進行診斷。
GO TO FULL VERSION