Python 網路爬蟲 Webcrawler教學 — Selenium 超好用的自動化爬蟲神器

SeanChien
9 min readNov 4, 2020

--

Photo by Sean Lim on Unsplash

前言

前面幾篇已經介紹過,透過Python用requests+bs4這兩個套件來做爬蟲,雖然可以很快速的靜態網頁的資訊的給抓下來,但是當網站有javascripts的時候,常常會讀不到想要的資料!所以今天要跟大家介紹Selenium這個超好用的爬蟲工具,還沒看過前面幾篇的朋友,可以點擊下方連結去了解一下:
➡️ Python 網路爬蟲Web Crawler教學 — 資料結構複習+Requests篇
➡️ Python 網路爬蟲Web Crawler教學 — Beautiful Soup篇

前置作業

今天要教跟大家分享的是Selenium的Webdriver的模組,在開始前除了要透過終端機安裝selenium之外,還要下載webdriver到自己電腦,這邊跟大家做一個簡單的教學!

✔️ 安裝 Selenium

pip3 install selenium #跟之前安裝requests 跟 bs4 一樣,直接輸入指令

✔️ 找到Chrome的版本,並安裝對應版本的Webdriver

接著,根據你Chrome瀏覽器的版本去下載對應版本的webdriver➡️ 載點
這邊要特別注意的是,假如你的版本是
86.X.XXXX,那就只能下載Chromedriver Version 86,下載錯誤的版本之後會無法使用喔!

另外跟大家簡單說明一下怎麼查詢自己的Chrome瀏覽器的版本呢?
Chrome設定>關於Chrome 或是 直接在瀏覽器輸入chrome://settings/help,就可以看到Chrome的版本了喔~

開始爬蟲

都準備好之後就要開始爬蟲拉!首先,先介紹一下Selenium到底在幹嘛?簡單來說,Selenium原本是用來做網頁自動化測試的一個工具,可以模擬使用者來操作瀏覽器。也正是因為這個特性,剛好很適合拿來做網路爬蟲!透過模擬使用瀏覽器,假裝是真人在做網頁搜尋,這樣就可以避免被辨識為機器人,可以很正確的讀取到相當多的資料。那接下來就正式開始啦🥳

開啟瀏覽器

from selenium import webdriverdriver = webdriver.Chrome('webdriver的路徑位址')
# 如果webdriver的檔案位址跟你正在的使用的python檔
# 是同一個資料夾的話,通常後面可以留空

跟以前不論是requests或是bs4一樣,都要先import模組進來,才能在這個python的檔案中使用。接著,用webdriver.Chrome()來開啟一個瀏覽器,並給這個瀏覽器一個變數名稱叫做driver,所以之後要對瀏覽器做任何操作,都是用driver.__來進行操作喔!

網址操作

driver.get('網址') #記得要把url包在字串裡面喔,不然會失敗!

透過get可以到達指定的網址,這也是最常用的前往某個網站的方法

driver.current_url

跟剛剛的get是前往某個網站相反,current_url則是取得現在這個瀏覽器所在頁面的網址!

driver.navigate().back() # 前一頁
driver.navigate().forward() # 下一頁
driver.navigate().refresh() # 重新整理

接下來這個這三個.navigate()相關的語法,就是大家常用的上一頁、下一頁還有重新整理啦,語法就跟字面上的一樣簡單好懂!

尋找元素(Element)

接下來,跟之前的bs4一樣,我們也是透過HTML中的元素來定位,然後來進行相關的操作!分為find_elementfind_elements兩種方式。特別注意,後者則會透過python的list方式來回傳喔!

使用方法其實非常簡單,看你要用哪種方式來找對應的元素,有下面幾種:

find_element_by 回傳找到的第一個元素

  • find_element_by_id #透過id去定位元素
  • find_element_by_name #透過name去定位元素
  • find_element_by_xpath #透過xpath去定位元素
  • find_element_by_link_text #透過連結的完整文字去定位元素
  • find_element_by_partial_link_text #透過連結的部分文字去定位元素
  • find_element_by_tag_name #透過標籤名稱去定位元素
  • find_element_by_class_name #透過class去定位元素
  • find_element_by_css_selector #透過css去定位元素

find_elements_by 用list回傳找到的全部元素

  • find_elements_by_id #透過id去定位元素
  • find_elements_by_name #透過name去定位元素
  • find_elements_by_xpath #透過xpath去定位元素
  • find_elements_by_link_text #透過連結的完整文字去定位元素
  • find_elements_by_partial_link_text #透過連結的部分文字去定位元素
  • find_elements_by_tag_name #透過標籤名稱去定位元素
  • find_elements_by_class_name #透過class去定位元素
  • find_elements_by_css_selector #透過css去定位元素

這邊的使用方法大致上跟bs4差不多,就不在贅述了,忘記的朋友們可以到Python 網路爬蟲Web Crawler教學 — Beautiful Soup篇去複習一下喔!

selenium的邏輯主要就是找到對應的元素後就是要進行操作,那我們就進行到下個單元,並且待會給大家一個範例!

執行操作

  • click() #點擊
  • send_keys() #傳值
  • execute_script(“javascript的語法”) #執行語法

像是點擊某個東西、在對應的欄位回傳某些值、或是下拉網頁來加載更多頁面都是常用的操作,這邊先給大家一個簡單的範例:

假如,今天要到google搜尋的頁面查詢"美國大選",並點擊查詢。可以透過下面的程式碼:

from selenium import webdriver
import time
driver = webdriver.Chrome('webdriver的路徑位址') #開啟瀏覽器driver.get('https://google.com') #記得要加http或httpsdriver.find_element_by_name('q').send_keys("美國大選") #輸入美國大選time.sleep(1) driver.find_element_by_name('btnK').click() #點擊google搜尋driver.close() #關閉瀏覽器

接著我們必須透過右鍵>檢查,來觀察網站的架構,並找定搜尋欄跟送出的元素,最後透過點擊來完成這次的任務。

這邊可以看到搜尋欄name="q”,然後用一樣的方式去找到google搜尋name="btnK”,然後透過send_keys(),將想輸入的字串放入。要點擊的話則是透過click()來實現,最後搜尋完畢後記得輸入close()來關閉瀏覽器。

這邊要特別注意,我在中間引入的time模組,並透過time.sleep(1)讓瀏覽器等待一秒才進行下一步。這是使用selenium最重要的一點,因為程式跑得相當的快,但瀏覽器因應網路加載的速度會有延遲,如果沒有等待,常常會出現找不到某個元素或是上一步驟還沒結束就跳到下一步。這也是造成使用selenium來爬蟲常常需要花費大量時間的原因,因為會需要將網路加載的時間考量進去,導致爬蟲效率降低。

至於下拉網頁這件事,可是在爬蟲中非常重要的一環,因為使用requests 來爬取資料的時候,只能加載部分資料,而透過下拉才能把剩下的資料給讀取出來,所以這時候就能體現出selenium的強大之處了!

driver.execute_script(“語法”) #這就是selenium的強大之處

但由於javascript語法太多了,這邊不細說,給大家兩個範例讓大家直接看!

driver.execute_script("window.scrollTo(X,Y)")#X就是橫坐標, Y就是縱座標, 可以試著輸入不同的值去看一下結果~driver.execute_script("alert('想跳出的字')")# alert('')是常見的跳出通知的js語法, 大家可以嘗試看一下會呈現怎樣!

BeautifulSoup解析

最後,進行完一些點擊或是下拉之後,其實可以直接透過selenium來看各個element的text,但這樣的解析方式效率太低,可以透過driver.page_source來把整個網頁的原始碼給擷取下來,然後再丟到bs4之中去做解析,這樣效能會大大的提升。

from selenium import webdriverfrom bs4 import BeautifulSoup---------------
省略開啟瀏覽器
並進行一連串的操作
----------------
soup = BeautifulSoup(driver.page_source, 'html.parser')driver.close()---------------
省略bs4解析
並進行爬蟲的操作
----------------

小結

大致上,這篇爬蟲教學就是先透過selenium進行一連串的操作,並且讀將完整的原始碼給擷取下來,再透過bs4來解析進行爬蟲。

透過Selenium,可以模擬一個使用者去做網頁的讀取解析,所以就可以順利的讀取javascript,而且還能克服許多反爬蟲的網站!但也因為必須開啟瀏覽器進行操作,所以爬蟲效率會大大降低,因此建議進行完一些需要javascript的操作之後就將完整的原始碼丟給BeautifulSoup去解析,這樣既能解決js的問題,也可以盡可能的加速爬蟲的過程!那今天的爬蟲分享就到這邊拉😂

我是尚恩,一個從商學院畢業的菜鳥工程師,有任何想從商轉換跑道的問題都可以找我聊聊,歡迎透過Linkedin@SeanChien聯絡我~

如果喜歡我的文章可以幫我鼓掌、訂閱、分享謝謝😇!

--

--

SeanChien
SeanChien

Written by SeanChien

SQA Engineer @ Amazon | 菜鳥工程師的CD之路 | UW MSBA 22 | Linkedin: www.linkedin.com/in/seanchien0525

No responses yet