Selenium簡介

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)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市马僻,隨后出現(xiàn)的幾起案子庄拇,更是在濱河造成了極大的恐慌,老刑警劉巖韭邓,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件措近,死亡現(xiàn)場離奇詭異,居然都是意外死亡女淑,警方通過查閱死者的電腦和手機(jī)瞭郑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸭你,“玉大人屈张,你說我怎么就攤上這事我抠。” “怎么了袜茧?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵菜拓,是天一觀的道長。 經(jīng)常有香客問我笛厦,道長纳鼎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任裳凸,我火速辦了婚禮贱鄙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姨谷。我一直安慰自己逗宁,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布梦湘。 她就那樣靜靜地躺著瞎颗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捌议。 梳的紋絲不亂的頭發(fā)上哼拔,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音瓣颅,去河邊找鬼倦逐。 笑死,一個胖子當(dāng)著我的面吹牛宫补,可吹牛的內(nèi)容都是我干的檬姥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼粉怕,長吁一口氣:“原來是場噩夢啊……” “哼健民!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斋荞,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤荞雏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后平酿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凤优,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年蜈彼,在試婚紗的時候發(fā)現(xiàn)自己被綠了筑辨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡幸逆,死狀恐怖棍辕,靈堂內(nèi)的尸體忽然破棺而出暮现,到底是詐尸還是另有隱情,我是刑警寧澤楚昭,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布栖袋,位于F島的核電站,受9級特大地震影響抚太,放射性物質(zhì)發(fā)生泄漏塘幅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一尿贫、第九天 我趴在偏房一處隱蔽的房頂上張望电媳。 院中可真熱鬧,春花似錦庆亡、人聲如沸匾乓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拼缝。三九已至,卻和暖如春搂根,著一層夾襖步出監(jiān)牢的瞬間珍促,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工剩愧, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娇斩。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓仁卷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親犬第。 傳聞我的和親對象是個殘疾皇子锦积,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348