CodeGym /Java Adesua /Python SELF TW /用最少的動態元件實現多頁面爬取

用最少的動態元件實現多頁面爬取

Python SELF TW
等級 38 , 課堂 1
開放

1. 導航準備

在開始我們的偉大冒險之前,我們需要準備好合適的工具:Selenium 和一點小技巧。我們假設你已經知道如何設置 Selenium 和瀏覽器驅動,那我們就開始吧!

設置驅動

Python

from selenium import webdriver

# 啟動瀏覽器驅動,比如 Chrome
driver = webdriver.Chrome()

# 打開我們冒險的第一頁
driver.get("http://example.com/start-page")

到目前為止一切正常——我們打開了瀏覽器並加載了起始頁面。但是有趣的部分來了:我們不想只是停留在一個頁面上。我們想訪問它的每一個鄰居頁面!

2. 分頁導航

最簡單和最友好的方式來導航頁面就是分頁導航。你一定見過那些可愛的小數字在頁面下方,對吧?它們就像路標:「你的下一站是第 2 頁」。

從頁面提取數據

在我們開始旅行之前,我們想收集當前頁面的信息。假設這包括商品列表或文章標題。

Python

def extract_data():
    # 在頁面上找到我們感興趣的所有元素,比如標題
    titles = driver.find_elements_by_class_name("item-title")
    for title in titles:
        print(title.text)  # 是的,我們只是打印文本,但你可以將其儲存在任何地方

extract_data()

如果你錯過了之前的講座,這段代碼會尋找所有具有類別 item-title 的標題並打印它們。

導航到下一頁

現在,我們已經收集了數據,是時候繼續前進了。分頁圓圈通常以指向下一頁或上一頁的按鈕出現。我們需要找到這些按鈕並點擊它們。

Python

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 像真正的專業玩家一樣瀏覽所有可用的頁面。

Python

while True:
    extract_data()  # 從當前頁面收集數據
    go_to_next_page()  # 跳轉到下一頁
    time.sleep(2)  # 稍作休息,避免驚動伺服器

現在,我們的 bot 勇敢地遍歷所有可以點擊 「Next」 按鈕的頁面。這段代碼將執行,直到頁面結束。記住,在請求之間留出短暫的休息時間——這是你與伺服器友好的表現。沒有人喜歡垃圾信息製造者,尤其是網站管理員。

4. 動態交互

朋友們,生活並不像這些分頁導航的例子那麼簡單。有時頁面行為像一個難以捉摸的忍者,在滾動時動態加載數據。別擔心,我們也會處理這種情況。

顯式等待

等待讓你的代碼能夠稍作停頓,直到需要的元素可用。當內容未立即加載時,這很有用。

Python

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 可以與動態加載的內容保持和諧,等待元素變得可用。

滾動頁面

針對像無限滾動這樣包含動態內容的魔法頁面,我們可能需要向下滾動頁面以加載更多元素。

Python

def scroll_down():
    # 使用 JavaScript 滾動至頁面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)

JavaScript 的腳本幫助平滑地向下滾動,允許頁面加載內容。你可以在循環中使用這種方法來處理無限滾動的頁面。

5. 特殊情況及技巧

跳出示例的範疇——這是一整本充滿驚喜的冒險故事。想像一下,你的 bot 和你一樣,必須為不同的情景做好準備。

如果沒有 「Next」 按鈕,但有帶有頁碼的分頁導航,可以採用動態方法,直接將頁碼插入 URL。而如果你訪問的網站突然變成了忍者,隱藏了一些頁面,那麼調整你的腳本,使其能夠適應,並且能夠面對任何意外。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION