說到建置Python網頁爬蟲的工具,之前我有整理了一篇「7個Python使用BeautifulSoup開發網頁爬蟲的實用技巧」的教學文章,今天這篇就用The News Lens 關鍵評論網的國際新聞為例,來分享Selenium常用的爬取資料方法,讓大家在建置Python網頁爬蟲爬取動態網頁的時候,可以快速上手。
- 安裝Selenium、Webdriver Manager
- 引用Selenium相關模組
- Selenium以CSS_NAME(樣式名稱)搜尋網頁資料
- Selenium以CSS_SELECTOR(樣式選擇器)搜尋網頁資料
- Selenium以TAG_NAME(標籤名稱)搜尋網頁資料
- Selenium以XPATH(XML路徑)搜尋網頁資料
- Selenium以ID屬性搜尋網頁資料
- Selenium的text爬取網頁資料屬性
一、安裝Selenium、Webdriver Manager
在開始使用Selenium建置Python網頁爬蟲之前,要先使用以下指令安裝Selenium與Webdriver Manager(瀏覽器驅動管理員)套件,如下:
$ pip install selenium webdriver-manager
二、引用Selenium相關模組
安裝好之後,就可以建立Python網頁爬蟲專案,引用Selenium相關的模組,如下範例:
from selenium import webdriver # 瀏覽器驅動模組 from webdriver_manager.chrome import ChromeDriverManager # Chrome瀏覽器驅動模組 from selenium.webdriver.common.by import By # 定位元素模組
更多Selenium模組的介紹及引用時機,可以參考我的全面掌握Selenium建置動態網頁爬蟲的步驟與重要模組文章教學。
引用好就可以建立Chrome瀏覽器驅動物件,發送請求到The News Lens 關鍵評論網的國際新聞,如下範例:
from selenium import webdriver # 瀏覽器驅動模組 from webdriver_manager.chrome import ChromeDriverManager # Chrome瀏覽器驅動模組 from selenium.webdriver.common.by import By # 定位元素模組 #建立Chrome瀏覽器驅動物件 driver = webdriver.Chrome(ChromeDriverManager().install()) #發送請求到目標網頁 driver.get('https://www.thenewslens.com/category/world')
假設我們想要爬取The News Lens 關鍵評論網的國際新聞標題資料,如下圖:
在新聞標題上點擊滑鼠右鍵,選擇「檢查」,可以看到它的網頁原始碼如下:
接下來,我就以這個網頁原始碼為例,來分別介紹Selenium提供的網頁資料爬取方法。
三、Selenium以CSS_NAME(樣式名稱)搜尋網頁資料
- find_element(By.CLASS_NAME, '樣式名稱'):
搜尋網頁中第一個符合指定的樣式名稱元素,如下範例:
title = driver.find_element(By.CLASS_NAME, "title")
- find_elements(By.CLASS_NAME, '樣式名稱'):
搜尋網頁中所有符合指定的樣式名稱元素,如下範例:
titles = driver.find_elements(By.CLASS_NAME, "title")
四、Selenium以CSS_SELECTOR(樣式選擇器)搜尋網頁資料
CSS_SELECTOR樣式選擇器其實就是利用「標籤名稱」搭配「樣式類別名稱」的方式來搜尋網頁元素,如下:
- find_element(By.CSS_SELECTOR, '樣式選擇器'):
搜尋網頁中第一個符合樣式選擇器的元素,如下範例:
title = driver.find_element(By.CSS_SELECTOR, "h2[class='title']")
- find_elements(By.CSS_SELECTOR, '樣式選擇器'):
搜尋網頁中所有符合樣式選擇器的元素,如下範例:
titles = driver.find_elements(By.CSS_SELECTOR, "h2[class='title']")
五、Selenium以TAG_NAME(標籤名稱)搜尋網頁資料
- find_element(By.TAG_NAME, '標籤名稱'):
搜尋網頁中第一個符合指定的標籤名稱元素,如下範例:
title = driver.find_element(By.TAG_NAME, "h2")
- find_elements(By.TAG_NAME, '標籤名稱'):
搜尋網頁中所有符合指定的標籤名稱元素,如下範例:
titles = driver.find_elements(By.TAG_NAME, "h2")
六、Selenium以XPATH(XML路徑)搜尋網頁資料
想要快速取得網頁元素的XPATH(XML路徑),可以在網頁元素的地方點擊滑鼠右鍵,選擇「Copy / Copy XPath」進行複製的動作,如下圖:
- find_element(By.XPATH, 'XPath路徑'):
搜尋網頁中第一個符合XPATH路徑下的元素,如下範例:
title = driver.find_element( By.XPATH, '//*[@id="list-container"]/article/div[1]/div/div[2]/div/h2/a')
- find_elements(By.XPATH, 'XPath路徑'):
搜尋網頁中所有符合XPATH路徑下的元素。
可以把上面範例中,定位到特定網頁元素的索引值(index)拿掉,即可搜尋所有符合這個XPATH路徑下的網頁元素,如下範例:
titles = driver.find_elements( By.XPATH, '//*[@id="list-container"]/article/div/div/div/div/h2/a')
七、Selenium以ID屬性搜尋網頁資料
- find_element(By.ID, 'ID屬性值'):
搜尋網頁中第一個符合指定的ID屬性元素,如下範例:
title = driver.find_element(By.ID, 'list-container')
由於同一份網頁中,ID屬性值不得重複,所以較少有機會搜尋網頁中所有符合指定的ID屬性值。
八、Selenium的text爬取網頁資料屬性
上面都是Selenium常用的搜尋網頁元素方法(Method),大家可以看到執行結果都是Selenium網頁元素物件,如下:
<selenium.webdriver.remote.webelement.WebElement (session="e3b3d3ac913f3752dd45f00737e038d2", element="f.F415C7CA1E75448FFB61696EF47924E7.d.5A63C7C7D91D805A65BD12A41BFC52BF.e.5")>
想要爬取網頁元素物件中的文字資料,就是要呼叫Selenium的text屬性,如下範例:
title = driver.find_element(By.CSS_SELECTOR, "h2[class='title']") print(title.text)
執行結果
【國際新聞圖輯】阿根廷紀念「骯髒戰爭」、泰國猴子成為「椰奶血汗勞工」、西班牙聖週畫下句點
如果是利用find_elements()方法爬取多個網頁元素,可以透過For迴圈來進行讀取,並且同樣呼叫Selenium的text屬性,來取得網頁文字資料,如下範例:
titles = driver.find_elements(By.CSS_SELECTOR, "h2[class='title']") for title in titles: print(title.text)
執行結果
【國際新聞圖輯】阿根廷紀念「骯髒戰爭」、泰國猴子成為「椰奶血汗勞工」、西班牙聖週畫下句點 【東南亞週報】新加坡貨輪撞塌巴爾的摩大橋|越國家主席武文賞請辭|泰國會眾議院通過同婚法案 殺死兒童的不只是戰爭:看見全球水資源危機的真相 莫斯科恐攻案:BBC記者探訪塔吉克農村,這裡是其中一名嫌犯的家鄉 疫情加劇民主衰退,但研究指出台灣是正面案例——教育、衛生和提高生活水準取得良好成績 ...
九、小結
想要建置Python網頁爬蟲爬取動態網頁,Selenium可以說是很常用的工具之一,透過它提供的各種網頁元素搜尋方法,可以輕鬆定位到想要爬取的網頁元素,再搭配text屬性,就可以取得網頁資料。經過這篇文章的介紹,希望對大家在爬取動態網頁上有所幫助!
你可能有興趣的文章
blog文章非常棒,有幸拜读了所有内容,受益良多
回覆刪除