動態網頁爬蟲第二道鎖 — Selenium教學:如何使用find_element(s)取得網頁元素(附Python 程式碼)

行銷資料科學
17 min readOct 11, 2020

--

大家好,歡迎來到爬蟲的世界!本篇文章是Selenium系列文章的第二篇~~

本篇參考大量Selenium說明文件,節錄部分程式碼及作者自行使用Selenium套件時的心得經驗,對其函式使用做更多延伸及說明。

對動態網頁爬蟲第一篇文章有興趣的可以參考以下文章:動態網頁爬蟲第一道鎖 — Selenium教學:如何使用Webdriver、send_keys

本篇文章會依序介紹以下內容,讓大家可以依此打開動態網頁爬蟲第二道鎖,才能順利的利用Selenium進行動態網頁爬蟲。

  1. 定位網頁元素
  2. Selenium函式的使用規則
  3. Selenium函式八大選擇器的使用方法:id、classname、tagname、link_text、XPath 、css_selector

在撰寫程式碼抓取網頁元素之前,我們一定要先知道資訊「在哪裡」跟「怎麼抓」,以下先就如何定位網頁元素來做說明。

1. 定位網頁元素

使用WebDriver時要學習的最基本技術之一,就是「如何在頁面上查找元素」。WebDriver可以視為目前畫面中的網頁(將其變數命名為driver),而我們可以使用Selenium強大的find_element(s)方法來定位目前網頁(WebDriver)中的元素,如程式碼1所示。

程式碼1

程式碼1所示,我們使用driver = webdriver.Chrome()可以開啟chrome網頁,網頁上方應會顯示「Chrome目前受到自動測試軟體控制。」的字樣,執行driver.get(default_url)後,可以前往特定網址,本篇文章以https://www.google.com.tw為例進行說明。

打開網頁檢視器(Windows系統:請按f12、macOS系統:請按option+command+c),會看到以下畫面,如圖一。旁邊內容包含了所有網頁上看得到的內容,也就是說,網頁上看得到的一定抓得下來!是不是很振奮人心呢!

圖一、網頁檢視器示意圖。

點擊網頁檢視器上方的鼠標,如圖二所示,再點擊想要查找原始碼的網頁元素,就可以快速定位原始碼了!

圖二、點擊鼠標。

圖二的鼠標圖示成功轉為藍色時,我們在頁面上滑動應該會如同動畫一,當鼠標在網路原始碼上移動時,原始碼對應到的網頁區塊就會反藍!

動畫一、瀏覽網頁原始碼及對應的區塊。(資料畫面來源:https://www.instagram.com/p/CEYqVrtp1HA/)

將鼠標移至畫面上想要查看的網頁區塊並點擊,右方的網頁檢視器便會幫我們找到對應的網頁原始碼段落,如同動畫二所示!是不是很方便啊!大家可以嘗試看看不同網頁的結果!

動畫二、查找對應的網頁原始碼段落。

2. Selenium函式的使用規則

Selenium函式的使用方法可以大致歸類為以下兩大原則,並互相搭配使用:

兩種函數:

  1. find_element:抓取符合條件的第一個項目,可搭配By方法。
  2. find_elements:抓取所有符合條件的項目,並回傳成list

八種方法:(WebDriver提供的內建選擇器類型)

  1. ID = id
  2. CLASS_NAME = class_name
  3. NAME = name
  4. LINK_TEXT = link_text
  5. PARTIAL_LINK_TEXT = partial_link_text
  6. TAG_NAME = tag_name
  7. XPATH = xpath
  8. CSS_SELECTOR = css_selector

3. Selenium函式:八大選擇器的使用方法

先載入需要的套件,如程式碼2所示。

程式碼2

舉例來說,要抓取id為example的網頁元素,可以有以下四種方法,如程式碼3所示:

程式碼3

而要抓取classname為「example」的網頁元素,可以將程式碼改寫成這樣,如程式碼4所示:

程式碼4

以下將對 WebDriver提供的八種內建選擇器分別進行說明。

1. Id

假如要抓取圖中的網頁元素,id為「gsr」,如圖三所示。

圖三、找到網頁元素包含id屬性者。

我們可以使用ID的方法來找到id=”gsr”的網頁元素,如程式碼5所示。

程式碼5

執行完後會出現以下結果。find_element(By)方法會回傳另一個Selenium基本類型,即WebElement

<selenium.webdriver.remote.webelement.WebElement (session=”d4de9095fa86aee9883f7c01c3f0b723", element=”35ebc8f8–2381–46b5-b32e-8bdebc65186a”)>

若使用find_elements(抓取所有符合條件者)則會回傳成list。

引用「已找到」的網絡元素後,我們可以再使用此網頁元素來找到更小範圍的網頁元素,以此類推,如程式碼6所示:

程式碼6

執行完上述程式碼後一樣回傳WebElement

<selenium.webdriver.remote.webelement.WebElement (session=”d4de9095fa86aee9883f7c01c3f0b723", element=”7fe8dafa-bd78–4a7b-801f-df37eeb18346")>

其他函數的執行方法跟結果都大同小異,只是在於函數內容不同以及跟抓取所使用的屬性不同,因此,以下將會重點說明不同方法之間的差異。

2. Classname

我們可以發現圖四這一個網頁元素,同時擁有class及id屬性,上一部分我們使用了id來抓取,這次我們可以嘗試使用class屬性及classname選擇器來抓取同樣的網頁元素。

圖四、找到網頁元素包含class屬性者。

這裡特別注意一下:字串內有空格的話要改為「.」:「hp vasq」改為「hp.vasq」,如程式碼7所示

程式碼7

3. Name

剛剛的網頁元素下方(子元素)可以看到有一個擁有name屬性的元素,如圖五所示,我們馬上來抓取看看吧!

圖五、找到網頁元素包含name屬性者。

Name的方法不太常用,不一定每個標籤都會有name屬性,但使用方法也是大同小異,如程式碼8所示。

程式碼8

4. LINK_TEXT

要使用LINK_TEXT方法,要知道href(帶有連結的屬性)對應的文字內容才行。例如:想獲取左上角「關於Google」的連結,如圖六所示,可以使用以下方法。

圖六、Google首頁「關於Google」按鈕的位置標示圖。

點擊網頁檢視器,將鼠標移至目標區域或按鈕並點擊,就會自動顯示該段的網頁原始碼了!如先前動畫二所示。

而我們可以看到這個網頁元素(HTML標籤為「a」),內含href、ping屬性,且包含一段黑色的顯示文字。這段文字(圖七紅框標示處)即是我們需要的LINK_TEXT內容!

圖七、找到網頁元素包含href屬性者,並找到內含的文字內容。

我們需要的關鍵字即是「關於Google」的文字內容,而抓取WebElement的方法如同程式碼9所示:

程式碼9

5. PARTIAL_LINK_TEXT

類似於LINK_TEXT方法,但只需要部份文字即可,如程式碼10所示。

程式碼10

特別注意的是可能會將其他不需要的資訊一起抓下來,例如我們可以看到「關於 Google」旁邊的「Google 商店」也包含類似文字內容「Google」,如圖八所示。

圖八、Google首頁相關按鈕位置標示圖。

而如圖九所示,我們也可以看到這兩個網頁元素確實都含有「Google」的文字內容。

圖九、Google首頁相關按鈕網頁原始碼。

假設我們想要抓取「Google商店」的網頁元素(位於第二項),使用PARTIAL_LINK_TEXT的選擇器,並使用「Google」作為關鍵字,就會抓到上一項「關於Google」的內容!

這時我們可以改用find_elements的函數來抓取所有符合條件的網頁元素,而find_elements的函數會將所有符合條件的網頁元素回傳成List,這時我們只要選擇第二個項目(Index為1)選取即可!如程式碼11所示。

程式碼11

6. TAG_NAME

這裡的tag即是HTML網頁標籤,是網頁檢視器裡紫色的字元部分,將網頁結構劃歸為各個階層,如圖十所示的head、body、style、div等。

圖十、HTML網頁標籤內容示意圖。

而我們可以使用HTML標籤名稱(即TAG),來抓取網頁元素,如程式碼12所示。

程式碼12

但是使用TAG選擇器特別要注意的是,HTML標籤時常重複,因此TAG選擇器通常適用於抓取大框架的網頁元素再做細部搜尋

7. XPATH

XPath是用於在XML文檔中定位節點的語言(可以想像網頁是圖書館,而各個網頁元素是書籍,XPath就有點類似於目錄編號,讓我們可以直接查找)。由於HTML可以是XML(XHTML)的實現,因此Selenium用戶可以利用這種強大的語言來定位網頁元素。

使用XPath最主要的原因是,當我們想要查找的元素沒有合適的id或name屬性時,可以使用XPath以絕對路徑(不建議使用)定位元素,也可以利用已知特殊id或name屬性的元素的相對路徑定位。

XPath包含來自HTML所有元素的位置(絕對路徑),因此,僅對網頁進行一點點調整就可能導致失敗(超級容易失敗,要不斷維護,非常不建議使用)

因此,比較適當的使用方式是,通過查找具有id或name屬性的附近元素(最好是父元素),使用相對路徑來找到目標元素(因為通常局部細節的改動會少一點),並且可以減少程式碼的維護成本。

如何獲取網頁元素XPath

  1. 打開網頁檢視器,找到目標網頁元素的內容,如圖十一所示。
圖十一、網頁檢視器示意圖

2. 在內容上點擊右鍵→Copy→Copy (full) XPath,獲取絕對或相對XPath。

在想要獲取XPath上的內容上點擊右鍵,如圖十二所示。

圖十二、在內容上點擊右鍵。

找到選單內的Copy清單,如圖十三所示。

圖十三、找到選單內Copy清單。

點擊Copy XPath就可以將所需的 XPath複製下來做進一步爬蟲了,而Copy XPath下方的Copy full XPath也是同樣的概念(完整路徑),都可以用作XPath選擇器進行爬蟲!如圖十四所示。

圖十四、點擊Copy XPath。

3. 將複製下來的XPath貼上,如程式碼13所示,

程式碼13

8. CSS_SELECTOR

終於到了最後一種啦!可喜可賀!這一種是不一定每個人都需要(能用第1~6種就盡量用),但是功能非常強大的方法。

如果你想定位的網頁元素沒有唯一的ID(或其他),則推薦使用CSS SELECTOR來查找元素。XPath和CSS選擇器有類似的工作模式,但是使用起來是全部方法中最複雜的。

相對簡單的使用方式是:找到網頁元素的XPath再改寫成css格式。

  1. 「/」改寫成「>」
XPath: //div/aCSS: div > a

2. 「//」改寫成「 (空格)」

XPath: //div//aCSS: div a

3. 用id查找「#」

XPath: //div[@id=’example’]CSS: #example

4. 用classname查找「.」

XPath: //div[@class=’example’]CSS: .example

因為css selector算是比較進階的使用方法了,其他還有非常多強大的功能,有興趣者可以參考https://www.w3schools.com/cssref/css_selectors.asp,裡面有非常完整的css說明文件,基本上前面七個方法即可以滿足大部分網頁爬蟲的需求了

大家可以自由嘗試合適的方法!!

以上就是本文關於Selenium的所有內容了!非常感謝大家用心的閱讀!

本文程式碼完整內容在此,祝大家爬蟲之路順順利利!

參考資料(皆為全英文內容)

1. Java, Python, C#, Ruby, JavaScript, Kotlin使用Selenium定位網頁元素的方法

2. Selenium.Webdriver的屬性及方法列表

3. 在Python內使用Selenium

4. Selenium CSS 選擇器的介紹

作者:戴若竹(臺灣行銷研究特邀作者)、鍾皓軒(臺灣行銷研究有限公司創辦人)

歡迎加入我們的Telegram獲取即時訊息!https://t.me/marketingdatascience
歡迎加入我們的Line@獲取即時訊息!https://line.me/R/ti/p/%40cde8265r

您可能有興趣:

📢TMR為您量身打造「全方位數據課程」

👨‍🎓熱門Python程式語言結合全新商業思維,快來終生學習不間斷!

【TMR】 X 【 好學校】
👨‍💼Python商業全系列數位課程👨‍💼

#行銷人必學實用Python課程

《 Python 0到1 基礎商業數據分析實戰 》
💥 價格 :3188
👉 從0開始:手把手從頭學習,適合完全沒學過的學員
👉 商業應用全台最多:傳授市面上少見的Python實務應用
👉 網路輿情爬蟲演練:網路輿情商務爬蟲技法
👉 競品分析:競爭價值定位圖找出藍海策略
👉 貨架陳列視覺化:解析行銷策略及廣告預算配置方法
🛒 前往購買:https://hahow.in/cr/python0-1

《 顧客分類大師:Python x RFM 會員經營新觀點 》
💥 價格 :2388

🎯 Python X RFM最佳拍檔,輕鬆鎖定潛(錢)在顧客
不需要出門,在家也能學習專業課程,讓你擁有會員經營的新思維!

本課程以五個面向為您的企業,做更深入的健診:
👉 市場面:以最基本的顧客消費資料(頻率、購買次數),將現有顧客區隔分類。
👉 財務面:計算出在每個顧客身上所賺得毛利,在不同客群中的獲利。
👉 行銷面:藉由 RFM 的分析進行行銷預算重新分配。
👉 產品面:觀察在不同客群中,各個產品的銷售狀況。
👉 顧客回購面:分析顧客的購買週期後,進行精準推薦。
🛒 前往購買:https://hahow.in/cr/rfm-model

《 AI 行銷學:用 Python 機器學習創造商業新價值 》
💥 價格 :3888
👉 全台第一門Python機器學習線上課程
👉 教導你快速理解Logistic Regression, XGBoost, Random Forest商務機器學習模型。
👉 建構老闆或主管們看得懂的模型評估指標,讓精準行銷方案更容易被接受且推出
👉 如何利用機器學習找出消費者心中的重要變數及客樣貌與特徵,做到個體及總體的商品推薦?
👉 如何從數以萬計的消費資料中偵測可能的詐欺名單?
🛒 前往購買:https://hahow.in/cr/python-ml

#實用投資分析課程

《 用 Python 打造自己的股票小秘書 》
💥 價格 :4288
👉 打造自動推播機器人,趁著股市最近低迷,找出最適進場點
👉 「到價提醒」功能,大大提升投資便利性
👉 了解Python雲端服務架構,完整的專案流程
👉 孰悉No SQL資料庫操作,未來大數據的基礎
🛒 前往購買:https://hahow.in/cr/stock-secretary

#好學校企業百大課程之一:

台科 EMBA 年年爆滿的一門 Word 課(A系列)
💥 價格 :950
👉 系統性學習Office軟體功能,教您別人不知道的快捷鍵
👉 調整不受控制的行距與精準對齊排版
👉 一鍵轉換Word到Excel
👉 有效率處理企畫書、畢業論文、小組報告、公文等
🛒 前往購買:https://hahow.in/cr/tmr-word1

台科 EMBA 年年爆滿的一門 Word 課(B+C系列)
💥 價格 :1,050
👉 傳授獨家快捷鍵字典
👉 分享好用的大綱模式,讓文章處理更有效率
👉 建立大綱模式、多層次清單、目錄與圖表目錄,掌握文件編輯規則
👉 優化文章的邏輯架構
🛒 前往購買:https://hahow.in/cr/tmr-word2

— — — — — — — — — — — — — — — — -

【TMR】 X 【工研院】
🏭工業4.0大數據智慧應用課程🏭

《Python工業4.0人工智慧:製程資料處理大師》

製程數據資料 X 資料科學,
為您開啟工業人工智慧領域的大門!
👉全球前十大智慧製程案例實戰
👉專業講師手把手帶您入門製程資料處理分析
👉課後完整模組心法讓您通通帶回家

💥價格 : 2,800
🏃趕緊手刀前往購買:https://bit.ly/39koNbn

— — — — — — — — — — — — — — — — -

2020課程地圖

💪 點我看更多

🏆 國內第一本行銷資料科學專書

💪 點我看書本資訊

🏆 國內第一本行銷資料科學 ” 實作 ” 專書

💪 點我看書本資訊

🏆國內第一本「股票小祕書」專書

附上購書網址~ 國外的朋友也可以使用博客來與金石堂的通路轉運到國外哦!

  1. 天瓏書局:http://bit.ly/stock-secretaryBot
  2. 博客來:https://www.books.com.tw/products/0010833772

--

--

行銷資料科學
行銷資料科學

Written by 行銷資料科學

Marketing data science. 台灣第一個行銷資料科學(MDS)知識部落,本粉絲專頁在探討行銷資料科學之基礎概念、趨勢、新工具和實作,讓粉絲們瞭解資料科學的行銷運用,並開啟厚植數據分析能力之契機。粉絲專頁:https://www.facebook.com/MarketingDataScienceTMR

Responses (1)