1. 聲明瀏覽器對象
Selenium支持非常多的瀏覽器捻勉,如Chrome粗卜、Firefox猾编、Edge等旗芬,可用如下方式進(jìn)行初始化:
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
Mac里需要將chromedriver放在usr/local/bin文件下
2.訪問頁面
可以用get()方法來請求網(wǎng)頁舌胶,參數(shù)傳入鏈接URL即可,此處拿訪問淘寶舉例:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('Https://www.taobao.com') #訪問淘寶
print('browser.page_source') #輸出淘寶頁面的源代碼
browser.close() #關(guān)閉瀏覽器
3. 查找節(jié)點
- 單個節(jié)點
所有獲取單個節(jié)點的方法:
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_tag_name
find_element_by_partial_link_text
find_element_by_class_name
find_element_by_class_selector - 多個節(jié)點
所有獲取多個節(jié)點的方法:
find_elements_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_tag_name
find_elements_by_partial_link_text
find_elements_by_class_name
find_elements_by_class_selector
4. 節(jié)點交互
Selenium可以驅(qū)動瀏覽器來執(zhí)行一些操作疮丛,也就是說可以讓瀏覽器模擬執(zhí)行一些動作幔嫂。比較常見的用法有:輸入文字是用send_keys()方法,清空文字時用clear()方法这刷,點擊按鈕時用click()方法婉烟。
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
imput = browser.find_element_by_id('q') #根據(jù)id找到搜索框
input.send_keys('iPhone') # 在搜索框內(nèi)輸入'iPhone'
time.sleep(1)
input.clear() #清楚搜索框內(nèi)的內(nèi)容
input.send_keys('iPad') #在搜索框內(nèi)輸入'iPad'
button = find_element_by_class_name('btn-search') #根據(jù)class_name找到搜索按鈕
button.click() #點擊搜索按鈕
browser.close()
更過交互動作介紹可參見官方文檔的交互動作介紹:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
5. 動作鏈
參見官方文檔介紹:http://selenium-python.readthedocs.io/api.html#module-selenium.webdrive.common.action_chains
6. 執(zhí)行JavaScript
對于某些操作,Selenium API并沒有提供暇屋。比如似袁,下拉進(jìn)度條,它可以直接模擬運行JavaScript,此時使用execute_script()方法即可實現(xiàn)昙衅,代碼如下:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') #將進(jìn)度條拉
browser.execute_script('alert("To Bottom")')
browser.close()
7. 獲取節(jié)點信息
- 獲取屬性
使用get_attribute()
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
logo = browser.find_element_by_id('zh-top-link-logo') #查找logo的節(jié)點
print('logo')
print(logo.get_attribute('class')) #輸出logo的屬性
- 獲取文本值
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zh-top-add-question')
print(input.text())
- 獲取ID扬霜、位置、標(biāo)簽名和大小
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zh-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(inout.size)
這里首先獲得“提問“按鈕的這個節(jié)點而涉,然后調(diào)用其id著瓶、location、tag_name啼县、size屬性來獲取對應(yīng)的屬性值材原。
8. 切換Frame
網(wǎng)頁中有一種節(jié)點叫做iframe,也就是子frame季眷,相當(dāng)于頁面的子頁面余蟹,它的結(jié)構(gòu)和外部網(wǎng)頁的結(jié)構(gòu)完全一致,需要使用switch_to.frame()方法來切換Frame子刮。
9. 延時等待
在Selenium中威酒,get()方法會在網(wǎng)頁框架加載結(jié)束后結(jié)束執(zhí)行,此時如果獲取page_source挺峡,可能并不是瀏覽器完全加載完成的頁面葵孤,如果某些頁面有額外的Ajax請求,我們在網(wǎng)頁源代碼中也不一定能成功獲取到橱赠。所以尤仍,這里需要延時等待一定的時間,確保節(jié)點已經(jīng)加載出來病线。
- 隱式等待
當(dāng)使用隱式等待執(zhí)行測試的時候吓著,如果Selenium沒有在DOM中找到節(jié)點,將繼續(xù)等待送挑,超出設(shè)定事件后绑莺,則拋出找不到節(jié)點的異常。使用implicitly_wait()方法實現(xiàn)隱式等待:
from selenium import webdriver
browser = web.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)
- 顯式等待
指定要查找的節(jié)點惕耕,然后指定一個最長等待時間纺裁,如果在規(guī)定時間加載出來了這個節(jié)點,就返回查找的節(jié)點司澎;如果規(guī)定的時間依然沒有加載出該節(jié)點欺缘,則拋出超時異常。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser,10)
input = wait.until(EC.presence_of_element_located((By.ID,'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))
print(input,button)
上訴代碼的效果是挤安,在10秒內(nèi)如果id為q的節(jié)點成功加載出來谚殊,就返回該節(jié)點;如果沒加載出來就拋出異常蛤铜。對于按鈕嫩絮,如果10秒內(nèi)它是可點擊的丛肢,就返回這個按鈕節(jié)點;如果沒有剿干,就拋出異常蜂怎。
所有的等待條件如下:
等待條件 | 含義 |
---|---|
title_is | 標(biāo)題是某內(nèi)容 |
title_contains | 標(biāo)題包含某內(nèi)容 |
presence_of_element_located | 節(jié)點加載出來,傳入定位元組置尔,如(By.ID,'p') |
visibility_of_element_located | 節(jié)點可見杠步,傳入定位元組 |
visibility_of | 可見,傳入節(jié)點對象 |
presence_of_all_elements_located | 所有節(jié)點加載出來 |
text_to_be_present_in_element | 某個節(jié)點文本包含某文字 |
text_to_be_present_in_element_value | 某個節(jié)點值包含某文字 |
frame_to_be_available_and_switch_to_it | 加載并切換 |
invisibility_of_element_located | 節(jié)點不可見 |
element_to_be_clickable | 節(jié)點可點擊 |
staleness_of | 判斷一個節(jié)點是否仍在DOM榜轿,可判斷頁面是否已經(jīng)刷新 |
element_to_be_selected | 節(jié)點可選擇幽歼,傳節(jié)點對象 |
element_located_to_be_selected | 節(jié)點可選擇,傳入定位元組 |
element_selection_state_to_be | 傳入節(jié)點對象以及狀態(tài)差导,相等返回True试躏,否則返回False |
element_located_selection_state_to_be | 傳入定位元組以及狀態(tài)猪勇,相等返回True设褐,否則返回False |
alert_is_present | 是否出現(xiàn)警告 |
10. 前進(jìn)和后退
使用back()方法后退,使用forward()方法前進(jìn)泣刹。
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('https://wwww.python.org')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
11. Cookies
使用Selenium可以對Cookies進(jìn)行操作助析,例如獲取、添加椅您、刪除Cookies等外冀。
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
12. 選項卡管理
在瀏覽器打開的時候,會開啟一個個的選項卡掀泳,在Selenium中雪隧,也可以對其進(jìn)行操作。
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()') #新建一個選項卡
print(browser.window_handles)
browser.switch_to.window(browser.window_handles[1]) #跳轉(zhuǎn)到第二個選項卡
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to.window(browser.window_handles[0]) #跳轉(zhuǎn)到第一個選項卡
browser.get('https://python.org')
browser.close()
13. 異常處理
使用try except語句來捕獲各種異常员舵。
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException
browser = webdriver.Chrome()
try:
browser.get('https://www.baidu.com')
except TimeoutException:
print('Time Out')
try:
browser.find_element_by_id('hello')
except NoSuchElementException:
print('No Element')
finally:
browser.close()
更多的異常類脑沿,可參考官方文檔:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions
以上總結(jié)于崔慶才的《python3網(wǎng)絡(luò)爬蟲開發(fā)實戰(zhàn)》