Selenium 1
Selenium 它能控制你的瀏覽器,多是應用在瀏覽器自動化方面,可依照指令將會像自動機器人一樣確實地執行,並且記錄一切測試的過程與錯誤;但在爬蟲也是個好工具,在一些動態網頁經過執行 js 後才能顯現,Selenium 便是一個很好解決動態網頁爬蟲的工具。
- 本篇文章是針對爬蟲內容編寫,詳細目錄 01.python 爬蟲入門。
- 本篇文章需要有 HTML 跟 CSS 基礎,可參考 02-2. HTML 跟 CSS 基礎。
- Selenium-Python 中文文檔
win7 開發環境
python 3.5
Selenium
$ pip3 install selenium
瀏覽器
Driver
實體瀏覽器,執行後會開啟一個自動瀏覽器控制;背景瀏覽器則是無介面瀏覽器 [1],若沒有檢視需求,爬蟲用背景瀏覽器即可。
實體瀏覽器
Ie/Firefox/Chrome 下載:https://www.seleniumhq.org/download/
啟動實體瀏覽器:
driver = webdriver.Ie('C:\IEDriverServer.exe') driver = webdriver.Firefox('C:\geckodriver.exe') driver = webdriver.Chrome('C:\chromedriver.exe')
背景瀏覽器
Chrome 59 下載:$ brew install Caskroom/versions/google-chrome-canary
啟動背景瀏覽器:
chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') driver = webdriver.Chrome(chrome_options=chrome_options,executable_path='/Users/xxxx/driver/chromedriver')
開一個頁面
get
URLfrom selenium import webdriver driver.get('http://pala.tw/js-example/') #輸入範例網址,交給瀏覽器
取得網頁原始碼
pageSource = driver.page_source #取得網頁原始碼 print(pageSource)
查找元素
單個元素
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
一次查找多個元素
搜尋結果不只一個(find_elements會形成list),先存起來,需要時在一個一個 print 出。
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
By 的一些可用属性
- ID = “id”
- XPATH = “xpath”
- LINK_TEXT = “link text”
- PARTIAL_LINK_TEXT = “partial link text”
- NAME = “name”
- TAG_NAME = “tag name”
- CLASS_NAME = “class name”
- CSS_SELECTOR = “css selector”
查找元素
通過
ID
查找元素示例:
<form id="loginForm">
查找元素:
driver.find_element_by_id('loginForm')
通過
Name
查找元素示例:
<input name="password" type="password"/>
查找元素:
driver.find_element_by_name('password')
通過
XPath
查找元素示例:
<html> <body> <form id="loginForm"> <input name="username" type="text" /> <input name="password" type="password" /> <input name="continue" type="submit" value="Login" /> <input name="continue" type="button" value="Clear" /> </form> </body> <html>
查找元素:
driver.find_element_by_xpath("/html/body/form[1]") #絕對定位 driver.find_element_by_xpath("//form[1]") #HTML頁面中的第一個form元素 driver.find_element_by_xpath("//form[@id='loginForm']") #包含id屬性並且其值為loginForm的form元素
通過
tag
查找元素示例:
<html> <body> <h1>Welcome</h1> <p>Site content goes here.</p> </body> <html>
查找元素:
driver.find_element_by_tag_name('h1')
通過
Class name
定位元素示例:
<p class="content">Site content goes here.</p>
查找元素:
driver.find_element_by_class_name('content')
通過
CSS 選擇器
查找元素示例:
<p class="content">Site content goes here.</p>
查找元素:選擇 class,要在開頭加上句點.
driver.find_element_by_css_selector('p.content')
頁面的動作
click()
:做一些相關滑鼠動作driver.find_element_by_id("category").click()
send_keys()
:輸入框中輸入一些内容element = driver.find_element_by_name("passwd").send_keys("some text") driver.find_element_by_id("passwd-id").send_keys(" and some", Keys.ARROW_DOWN) # 輸入方向鍵
switch_to_window()
:在不同的視窗和框架之間移動driver.switch_to_window("windowName")
switch_to_alert()
:彈出對話框alert = driver.switch_to_alert()
forward()
&back()
:訪問瀏覽器歷史紀錄driver.forward() #前進 driver.back() #後退
取得值
page_source
:取得網頁原始碼pageSource = driver.page_source #取得網頁原始碼 print(pageSource)
current_url
:取得當前網址driver.current_url
get_attribute
:取得值HTML
<input type="text" maxlength="9" name="period_no_short" class="input-txt w120" size="4" value="32" positiveinteger="true">
get_attribute()
self.period_no_short = self.driver.find_element_by_xpath( '//*[@id="setting_table"]/tbody/tr[5]/td[2]/div/input[1]' ).get_attribute("value") >>> 32
text
:取得文字HTML
<td class="tl" bordercolordark="#ffffff" bordercolorlight="#000000"> Jeffery Test Member Client <input type="hidden" name="content" value="Jeffery Test Member Client"> </td>
text
driver.find_element_by_xpath('//*[@id="list_table"]/tbody/tr[1]/td[2]').text >>> Jeffery Test Member Client