更新於 2023/07/23閱讀時間約 6 分鐘

【筆記】Selenium 實作:讓你的網頁自動幫你開啟網站

    當Selenium環境做好以後就可以拿它來做點事情了,這次我們試試如何讓網頁幫你搜尋並登入網站,以電子書網站readmoo為例。

    延續【筆記】Selenium with Python 環境配置

    #導入webdriver​
    from selenium import webdriver

    #建立一個chrome的webdriver
    driver = webdriver.Chrome()

    #開啟的網址是google首頁
    driver.get("https://www.google.com")

    #防止網頁馬上開了就關,再執行一次檔案就可以關閉頁面
    input()

    為了要讓接下來的程式運作順利,我們需要載入兩個套件:

    #載入需要的套件​
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys​
    • By 套件 用於協助定位元素,讓我們可以在頁面中找到想要的操作元素

    常用的定位方法如:

    By.CSS_SELECTOR:抓CSS選擇器來定位,幾乎可以做到大多數的定位方式

    By.ID:抓"ID"屬性來定位

    By.NAME:抓"NAME"屬性來定位

    By.LINK_TEXT:根據連接元素的文本內容來定位

    By.XPATH:用XPath表達式定位

    By.TAG_NAME:用標籤定位元素,例如<div>、<p>、<a>、<input>

    開啟瀏覽器的「開發人員工具」,點擊元素(Elements)分頁就可以看到了

    google搜尋欄位的元素

    • Keys 套件 用於模擬鍵盤操作

    常用的操作如:

    Keys.ENTER:就是鍵盤上的ENTER,Keys.RETURN同等意思

    Keys.ESCAPE:Esc鍵

    Keys.ARROW_UP:上箭頭;DOWN,下箭頭;LEFT,左箭頭;RIGHT,右箭頭。

    Keys.BACKSPACE:退格鍵,就是鍵盤的ENTER上面長長的"<——"

    Keys.DELETE:刪除鍵

    Keys.PAGE_UP:Page Up鍵,可以頁面往上移動

    Keys.PAGE_DOWN:Page Down鍵,可以頁面往下移動


    導入套件後,首先我們需要定位google的搜尋欄位,以上方截圖當例子:

    #定義一個​變數為search_box,它是用來抓取搜尋欄位的元素的
    search_box = driver.find_element(By.NAME,"q")


    抓取到我們要的元素以後,由於我們要搜尋Readmoo這本電子書的網站,因此我們就讓輸入框輸入 "readmoo"

    #調用​search_box鎖定的輸入框,在輸入框輸入 readmoo
    search_box.send_keys("readmoo")


    輸入完之後,點擊送出

    #調用​search_box鎖定的輸入框,在輸入框模仿鍵盤按ENTER
    search_box.send_keys(Keys.ENTER)


    結果如下:

    接著我們要控制瀏覽器鎖定Google搜尋結果:

    #​定義一個變數為 search_results,用來抓取Google搜尋結果的元素
    search_results = driver.find_elements(By.CSS_SELECTOR, "div.g")


    "div.g"怎麼來的

    透過瀏覽器的「開發者工具」,我們會發現網頁用<div></div>把搜尋結果包在裡面,如下圖:

    展開後,每個搜尋結果的class都會一個帶有g開頭(google額外的廣告會是不同的格式),所以可以用css選擇器(By.CSS_SELECTOR)選擇div裡面的g,篩選到每個搜尋結果,如下圖:

    我們篩選第一個當成是我們到網站的選項,並且點擊,到達我們要到的網址

    #定義first_results,他是搜尋結果的第一個
    first_results = search_results[0]
    #定義link,調用​first_results,並進行定位
    link = first_results.find_element(By.TAG_NAME,"h3")
    #點擊link​
    link.click()

    結果如下:

    閃退了,並出現錯誤提示

    錯誤提示 IndexError: list index out of range,表示嘗試訪問的陣列元素索引超出陣列範圍,在網頁自動化跳轉的情況下產生這個錯誤通常是網頁還沒有載入資料就先執行檔案了,導致抓不到。

    因此需要讓我們的driver多一點等待,需要加入這個設定:

    #​driver加入隱含等待
    driver.implicitly_wait(10)

    隱含等待告訴selenium尋找元素時,最多等10秒,如果10秒內出現要尋找的元素,繼續執行後續的程式碼,等超過10秒都沒有出現,則跳異常。

    總結

    #導入webdriver​
    from selenium import webdriver

    #套件​
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.keys import Keys

    driver = webdriver.Chrome()
    driver.get("https://www.google.com")
    driver.implicitly_wait(10)

    #google欄位,關鍵字輸入
    search_box = driver.find_element(By.NAME,"q")
    search_box.send_keys("readmoo")
    search_box.send_keys(Keys.ENTER)

    #搜尋結果定位
    search_results = driver.find_elements(By.CSS_SELECTOR, "div.g")
    first_results = search_results[0]
    link = first_results.find_element(By.TAG_NAME,"h3")
    link.click()

    input()


    結果如下:

    我們讓瀏覽器自動幫我們搜尋預想到的頁面了,但頁面有彈窗,如果想要讓瀏覽器做別的動作,那就會需要對彈窗進行處理,下一篇內容會讓瀏覽器關閉彈窗,並自動登入帳號成功。

    分享至
    成為作者繼續創作的動力吧!
    © 2024 vocus All rights reserved.