python網路爬蟲教學-Selenium基本操作

星期三 04 Sep 2019   even  
教學

前言

Selenium原為網頁測試工具,但由於可以直接以程式碼操控瀏覽器的特性,使其成為網路爬蟲必備的工具之一。

啟用selenium之後,你指定的瀏覽器就會開啟,並依照你所編寫的指令依序執行,所有網頁的操作,包含: 輸入帳號、密碼、點選按鈕、滾動頁面、變化視窗等,都可以使用程式碼進行。由於是真正的瀏覽器在運作,絕大多數的網站都可以輕鬆的突破,但也因此導致運行速度極慢、占用較高的電腦效能。一般還是會先嘗試使用requests獲取網頁原始碼,但如果實在無法突破對方網站伺服器的阻隔時,就可以改用selenium試試看。

使用設定

selenium支援多種程式語言,包含Java、JavaScript、Python等,本系列只專注於python上。

首先,安裝selenium,如下:

pip install selenium

接著,必須根據您想啟用的瀏覽器、作業系統,下載各自對應的WebDriver,為了避免版本不符的問題,建議下載最新的版本,同時也將瀏覽器更新到最新的版本。

載點: firefox: geckodriver、chrome: chromedriver

下載之後,你必須

(1) 將WebDriver放到你的環境目錄底下,或是

(2) 運行時指定driver的路徑。

由於執行selenium時,會開啟這個執行檔,因此必須設定好路徑。

開啟與關閉瀏覽器

首先要啟動瀏覽器,以及設定瀏覽器,不同瀏覽器會需要不同的程式碼,我主要使用的是chrome及firefox,因此會以這兩者來介紹。

Firefox

from selenium import webdriver

driver = webdriver.Firefox() #開啟firefox

driver.get("https://freelancerlife.info/") #前往這個網址

driver.close()#關閉瀏覽器

假設沒有額外變更firefox的安裝目錄,並且將geckodriver放置在環境目錄底下的話,上面的程式碼應該可以正確運行。

在網址旁邊會有個圖示,表示這個瀏覽器目前是被別的程式控制的,沒錯!就是你的selenium程式。

如果無法,可以嘗試直接指定這兩個檔案的位置,firefox.exe,以及在先前下載的firefox對應到的webdriver,geckodriver.exe,如下:

from selenium import webdriver
from selenium.webdriver.firefox.firefox_binary import FirefoxBinary

firefox_path = 'C:\\Program Files\\Mozilla Firefox\\firefox.exe' # 改成你自己firefox.exe的位置
webdriver_path = 'C:\\geckodriver.exe' # 改成你檔案的位置
binary = FirefoxBinary(firefox_path)
driver = webdriver.Firefox(executable_path=webdriver_path,firefox_binary=binary) #開啟firefox
driver.get("https://freelancerlife.info/") #前往這個網址
driver.close()

chrome

不設定執行檔位置的使用方式與設定好執行檔位置的使用方式:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://freelancerlife.info/") #前往這個網址
driver.close()
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options.binary_location = "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"
webdriver_path = 'C:\\chromedriver.exe'
options = Options()
driver = webdriver.Chrome(executable_path=webdriver_path, options=options)
driver.get("https://freelancerlife.info/") #前往這個網址
driver.close()

在網址下方會顯示Chrome正受到自動測試軟體控制,也就是你的selenium程式碼。

操控瀏覽器

以python進行facebook的網路爬取為例,你需要使用selenium開啟瀏覽器,輸入帳號、密碼,按下登入,再前往目標社團、粉絲頁、某某人的專頁,之後你會需要將頁面往下捲,將某些按鈕點開(如: 顯示隱藏的留言),才能讓所有的資訊顯示出來,接著再存取網頁原始檔,額外以re或beautifulsoup剖析原始碼,抓取目標資訊。

上面的過程中需要的selenium操作,包含: 鎖定元素、點選該元素、填寫數值到該元素、頁面捲動等,以google為例,首先,開啟瀏覽器前往google:

from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://google.com')

使用driver.get(url)讓你的瀏覽器前往特定網址,接著我們試著讓google搜尋"python is awesome"這個關鍵字,必須要鎖定這個元素,才能送入任何輸入,例如點選或文字。

selenium提供了find_element_by_XXX以及find_elements_by_XXX,藉由XXX尋找單一元素或多個符合的元素,XXX包含id、name、xpath、link_text、 partial_link_text、tag_name、class_name、class_name,依照狀況使用,可參考官方說明

我們在這個步驟需要鎖定兩個元素,搜尋文字輸入及開始搜尋按鈕,你可以檢查各自對應的html原始碼,然後再思考要怎麼鎖定這兩個元素。

這兩個元素的原始碼為:

<input class="gLFyf gsfi" maxlength="2048" name="q" type="text" jsaction="paste:puy29d" aria-autocomplete="both" aria-haspopup="false" autocapitalize="off" autocomplete="off" autocorrect="off" role="combobox" spellcheck="false" title="Google 搜尋" value="" aria-label="搜尋" data-ved="0ahUKEwjSzve1zrjkAhX3wosBHUgTCUsQ39UDCAQ">

<input class="gNO89b" value="Google 搜尋" aria-label="Google 搜尋" name="btnK" type="submit" data-ved="0ahUKEwjQ7aXyx7nkAhXtKqYKHZwJBygQ4dUDCAk">

根據這兩串原始碼,我們可以用find_element_by_name('q')find_element_by_name('btnK'),來定位這兩個元素,之後分別進行送入文字、點選。

如下:

search_input = driver.find_element_by_name("q")
search_input.send_keys('python is awesome')

之後使用selenium定位到"搜尋",再按下搜尋。

start_search_btn = driver.find_element_by_name("btnK")
start_search_btn.click()

使用selenium到達目標頁面後,再使用driver.page_source將網頁原始碼抓取下來,這時候selenium的任務就已經大功告成了。

只要能夠不被阻攔的獲取網頁資訊,接下來只需要再慢慢剖析原始碼,抓取資訊。因此,成功抓到原始碼後就可以將selenium關掉了。

htmltext = driver.page_source
driver.close()

Bonus Tip:

使用selenium進行每個動作後,記得要經常加入time.sleep,等候瀏覽器完全地將資訊讀取進來,再來定位元素、進行互動,否則會出現類似下面這種錯誤:

ElementNotInteractableException: Element <input class="gNO89b" name="btnK" type="submit"> could not be scrolled into view

因此,這段教學的程式碼應該改成:

from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get("https://www.google.com/")
time.sleep(2)
search_input = driver.find_element_by_name("q")
search_input.send_keys('python is awesome')
time.sleep(2)
start_search_btn = driver.find_element_by_name("btnK")
start_search_btn.click()

htmltext = driver.page_source
driver.close()

結尾

OK!以上就是selenium的基本設置與使用教學。學會使用這項工具後,就能簡單的處理需要"登入"的網頁,例如: facebook。這也是我預計在下篇教學帶給大家的,如何進行facebook的爬蟲,請各位拭目以待~~

感謝您耐心閱讀到最後,希望有帶給你一些幫助,我們有緣再見~

python 網頁爬蟲教學
python網路爬蟲簡介
python網路爬蟲基本工具(1)
python網路爬蟲教學-實戰篇(1) 蘋果日報馬網
使用偽裝user-agent爬取蝦皮購物網
撈取深網中的資料-蝦皮購物API
以POST方式抓取資料-政府電子採購網
python網路爬蟲教學-Selenium基本操作
python網路爬蟲應用-facebook社團成員參與度分析

相關文章:

>