iT邦幫忙

2024 iThome 鐵人賽

DAY 16
0
Python

Python大戰之網頁爬蟲系列 第 16

[Day 16] 爬蟲工具 – Selenium實作

  • 分享至 

  • xImage
  •  

在昨天進行完完整的環境設置以及第一支Selenium的程式後,
我們今天就要嘗試撰寫一些更進階的實作,並試試看我們能不能達成。

目標:

我會瀏覽網路上的一些現有資源,並自己試著去操作看看,
並將遇到的問題做出檢討並修正,並嘗試對一些範例做更動。
那以下就直接進行到實作的環節了:

實作

以下是我撰寫的第一個實作程式,我這次是想用試著跟上
最近很火的話題「周杰倫演唱會」,並嘗試著做出相關程式,以下我將會分行解釋:
(部分程式碼引用自https://www.youtube.com/watch?v=o_gy3V6L-Vg)

https://ithelp.ithome.com.tw/upload/images/20240930/20169196YRpoZRk5Q5.png

首先來先看到前幾行,就是將一些會應用到的套件匯入到這個Python程式內,
而在這邊有用到的套件就有像是webserver(網頁瀏覽器)、By(用來指定選取元素)、
以及sleep(讓程式執行時暫停一段時間),keys(模擬按鍵)。

在引進這些等等會應用的套件後,我們就要來進行主程式的撰寫:

driver = webdriver.Chrome():

我們可以把上述的程式碼分成幾個部分來解釋:
首先我們要先了解到什麼是「driver」,簡單來說,
它就是可以控制 Chrome 瀏覽器的一個「遠端控制」工具。
你可以通過 driver 物件來執行一系列的操作,例如:

• driver.get():導航到一個特定的網頁。
• driver.find_element():查找頁面上的元素。
• driver.quit():關閉瀏覽器。

那後面webdriver.Chrome()的部份,其實就是Selenium 提供的
建立 Chrome 瀏覽器控制物件的一個方式。
它會利用到我們前面安裝過的chromedriver來
與Chrome上的網頁進行連接(給Chrome瀏覽器專用的 WebDriver 驅動程式),
並會建立一個webdriver物件,把不同物件賦值交給driver。

簡單總結來說,driver = webdriver.Chrome()的功用就是以下幾點:

啟動 Chrome 瀏覽器。
通過 chromedriver 來與瀏覽器溝通。
建立一個 driver 物件來控制瀏覽器的行為

driver.get('https://www.google.com')
此處跟我們的第一支程式的內容一樣,
目標就是要導航到https://www.google.com 這個URL,也就是google的首頁。

time.sleep(3):

因為這行在這支程式碼裡面出現了非常非常多次,所以在這邊統一解釋一下它的功用:
time sleep()這個指令指的就是等待「上一個動作結束」,
換句話說,就是為上一個動作設置一個「延遲」。
舉這邊的例子,我們的上一個動作是導航到google網頁,
那設置等待的目的就是為了讓導航到google這個動作可以完整地進行,
避免因為可能網路速度過慢或其他原因導致要進行下一步驟時,網頁還沒完整的顯示。

elem = driver.find_element(By.NAME, 'q'):

這邊則就是一個抓取元素的方法,使用 find_element() 方法根據
元素的 name 屬性來尋找搜尋框。
這裡 By.NAME 指的是依據名稱 (name='q') 來查找對應的搜尋框元素,
並將其賦值給變數 elem。

那可能就有人會問了:「為什麼是q ?,不能是其他的嗎」,
事實上,這邊的 ’q’ 意思指的是google的搜尋框(如下圖的HTML),
會根據網頁的HTML構成不同,而對編寫的程式碼有不同改變。

https://ithelp.ithome.com.tw/upload/images/20240930/20169196ERin0HxxW1.png

(圖片來源: https://www.youtube.com/watch?v=o_gy3V6L-Vg)

elem.send_keys("周杰倫演唱會")
接著,我們就是要對搜尋欄自動輸入我們想要查找的關鍵字,
在我這邊的範例中就是「周杰倫演唱會」。
這邊就是使用了前面有提到的keys,並跟send一起結合起來,
結果就是會變成模擬一個鍵盤的「輸入動作」,
將關鍵字「周杰倫演唱會」放上搜尋欄中。

elem.send_keys(Keys.RETURN)

下一步,理所當然就是將打好的結果送出,這邊還是一樣
調用send_keys的方法,Keys.RETURN 這邊代表鍵盤的「Enter」鍵,
也就是當用戶按下鍵盤上的回車鍵時會觸發的動作。

Selenium 提供了 Keys 類來表示特殊鍵,例如像是 Keys.ENTER、Keys.SPACE 等。
(RETURN 和 ENTER 在大多數情況下是相同的,都是模擬「回車」行為。)

search_results = driver.find_element(By.ID, "search").text
print('搜尋結果',search_results)

最後,就是要爬取我們要的結果在使用者端。
這邊的By.ID的概念跟前面的大致一樣,只是把目標物改成search,
也就是網頁的搜尋結果。
而.text則是會提取該元素中的文字內容,將搜尋結果的文字
提取出來並存儲到變數 search_results中。

driver.quit()

在進行完所有動作後,我們就是把剛剛的整個執行檔關閉,
避免發生一些不必要的問題,像是占用系統的資源、記憶體洩漏等等。

全部都完成後,我們就可以來看看我們得到的結果:

https://ithelp.ithome.com.tw/upload/images/20240930/20169196uag8XOJ5GB.pnghttps://ithelp.ithome.com.tw/upload/images/20240930/20169196wfJrDOlmMe.pnghttps://ithelp.ithome.com.tw/upload/images/20240930/20169196ENgNIzCHAS.pnghttps://ithelp.ithome.com.tw/upload/images/20240930/20169196XLrIv1zqZs.png

最後就可以在下方得到我們的爬取結果。
(以上四張圖都是由系統自動進行的動作,並不是手動操作,但由於無法上傳影片,故改以截圖方式呈現。)

參考資料:
https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.keys.html
https://ithelp.ithome.com.tw/articles/10300961
https://www.youtube.com/watch?v=o_gy3V6L-Vg


上一篇
[Day 15] 爬蟲工具 – Selenium模組
下一篇
[Day 17] 爬蟲工具 – Selenium實作-2
系列文
Python大戰之網頁爬蟲30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言