1. 導航準備
在開始我們的偉大冒險之前,我們需要準備好合適的工具:Selenium 和一點小技巧。我們假設你已經知道如何設置 Selenium 和瀏覽器驅動,那我們就開始吧!
設置驅動
from selenium import webdriver
# 啟動瀏覽器驅動,比如 Chrome
driver = webdriver.Chrome()
# 打開我們冒險的第一頁
driver.get("http://example.com/start-page")
到目前為止一切正常——我們打開了瀏覽器並加載了起始頁面。但是有趣的部分來了:我們不想只是停留在一個頁面上。我們想訪問它的每一個鄰居頁面!
2. 分頁導航
最簡單和最友好的方式來導航頁面就是分頁導航。你一定見過那些可愛的小數字在頁面下方,對吧?它們就像路標:「你的下一站是第 2 頁」。
從頁面提取數據
在我們開始旅行之前,我們想收集當前頁面的信息。假設這包括商品列表或文章標題。
def extract_data():
# 在頁面上找到我們感興趣的所有元素,比如標題
titles = driver.find_elements_by_class_name("item-title")
for title in titles:
print(title.text) # 是的,我們只是打印文本,但你可以將其儲存在任何地方
extract_data()
如果你錯過了之前的講座,這段代碼會尋找所有具有類別 item-title
的標題並打印它們。
導航到下一頁
現在,我們已經收集了數據,是時候繼續前進了。分頁圓圈通常以指向下一頁或上一頁的按鈕出現。我們需要找到這些按鈕並點擊它們。
def go_to_next_page():
try:
# 找到下一頁按鈕並點擊它
next_button = driver.find_element_by_link_text("Next")
next_button.click()
except NoSuchElementException:
# 如果按鈕不存在,那麼我們到了結尾
print("頁面列表結束。")
這個函數尋找帶有文本 「Next」
的鏈接。如果找到,它會點擊跳轉到下一頁。如果沒有,我們的 bot 就明白已到互聯網的盡頭……至少是這系列頁面的盡頭。
3. 循環頁面導航
我們還缺點什麼來讓一切更完美?對了,循環!讓我們把這些結合到一個方便的循環中,讓我們的 bot 像真正的專業玩家一樣瀏覽所有可用的頁面。
while True:
extract_data() # 從當前頁面收集數據
go_to_next_page() # 跳轉到下一頁
time.sleep(2) # 稍作休息,避免驚動伺服器
現在,我們的 bot 勇敢地遍歷所有可以點擊 「Next」
按鈕的頁面。這段代碼將執行,直到頁面結束。記住,在請求之間留出短暫的休息時間——這是你與伺服器友好的表現。沒有人喜歡垃圾信息製造者,尤其是網站管理員。
4. 動態交互
朋友們,生活並不像這些分頁導航的例子那麼簡單。有時頁面行為像一個難以捉摸的忍者,在滾動時動態加載數據。別擔心,我們也會處理這種情況。
顯式等待
等待讓你的代碼能夠稍作停頓,直到需要的元素可用。當內容未立即加載時,這很有用。
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("未找到元素。")
使用此函數,你的 bot 可以與動態加載的內容保持和諧,等待元素變得可用。
滾動頁面
針對像無限滾動這樣包含動態內容的魔法頁面,我們可能需要向下滾動頁面以加載更多元素。
def scroll_down():
# 使用 JavaScript 滾動至頁面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
JavaScript 的腳本幫助平滑地向下滾動,允許頁面加載內容。你可以在循環中使用這種方法來處理無限滾動的頁面。
5. 特殊情況及技巧
跳出示例的範疇——這是一整本充滿驚喜的冒險故事。想像一下,你的 bot 和你一樣,必須為不同的情景做好準備。
如果沒有 「Next」
按鈕,但有帶有頁碼的分頁導航,可以採用動態方法,直接將頁碼插入 URL。而如果你訪問的網站突然變成了忍者,隱藏了一些頁面,那麼調整你的腳本,使其能夠適應,並且能夠面對任何意外。
GO TO FULL VERSION