自動化測試工具,支持多種瀏覽器,在爬蟲中主要用來解決JavaSript渲染的問題。 (驅動瀏覽器,發送一些指令,讓瀏覽器完成一些動做)javascript
requests urllib這些庫沒法正常獲取網頁內容時,這些網頁多是後來javascript渲染過的,用selenium能夠完成渲染,獲取到網頁渲染完後的源代碼,這樣就解決了javascript渲染的網頁沒法獲取的問題php
安裝:css
pip3 install seleniumhtml
基本使用java
聲明瀏覽器對象:python
from selenium import webdriverjquery
browser = webdriver.Chrome()web
browser = webdriver.Chrome()ajax
browser = webdriver.Edge()api
browser = webdriver.PhantomJS()
browser = webdriver.Safari()
訪問頁面:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com')
print(browser.page_source)
browser.close()
查找元素:
(好比要找輸入框輸入信息,找到按鈕進行點擊)
查找單個元素
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.taobao.com') input_first = browser.find_element_by_id('q') input_second = browser.find_element_by_css_selector('#q') input_third = browser.find_element_by_xpath('//*[@id="q"]') print(input_first) print(input_second) print(input_third) browser.close() 輸出結果爲: <selenium.webdriver.remote.webelement.WebElement (session="5c077333f76c85be9bb897e4104fd04e", element="0.7841876974650306-1")> <selenium.webdriver.remote.webelement.WebElement (session="5c077333f76c85be9bb897e4104fd04e", element="0.7841876974650306-1")> <selenium.webdriver.remote.webelement.WebElement (session="5c077333f76c85be9bb897e4104fd04e", element="0.7841876974650306-1")>
運行結果爲u<class 'selenium.webdriver.remote.webelement.WebElement'>類型,element有一個代號,input_first,input_second,input_third三個元素的代號相同,是徹底等價的,也就是說找元素的方法是相同的,下面是一些經常使用的方法:
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
一種通用的查找方式:
from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('http://www.taobao.com') input_1 = browser.find_element(By.ID,'q') print(input_1) browser.close() 輸出結果爲: <selenium.webdriver.remote.webelement.WebElement (session="9b780326594b2b8e699bd3b6f4955141", element="0.44836792421187854-1")>
查找多個元素:
把element改成elements
from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('http://www.taobao.com') input_1 = browser.find_elements(By.CSS_SELECTOR,'.service-bd li') print(input_1) browser.close() 輸出結果爲: [<selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-1")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-2")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-3")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-4")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-5")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-6")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-7")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-8")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-9")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-10")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-11")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-12")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-13")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-14")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-15")>, <selenium.webdriver.remote.webelement.WebElement (session="270374ca380ccbd97758a1ee34663986", element="0.19502462209113514-16")>]
結果爲一個列表
查找單個元素與查找多個元素同樣,惟一的不一樣就是element改成elements
元素的交互操做:
對獲取的元素調用交互方法(好比對輸入框輸入文字,對按鈕進行點擊等)
from selenium import webdriver import time browser = webdriver.Chrome() browser.get('https://www.taobao.com') input = browser.find_element_by_id('q') input.send_keys('小米8') time.sleep(1) input.clear() input.send_keys('華爲pro') button = browser.find_element_by_class_name('btn-search tb-bg') button.click()
交互動做:
將動做附加到動做鏈(須要引入一個ActionChains)中串行執行
from selenium import webdriver from selenium.webdriver import ActionChains browser = webdriver.Chrome() url ='http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult') source = browser.find_element_by_css_selector('#draggable') target = browser.find_element_by_css_selector('#droppable') actions = ActionChains(browser) actions.drag_and_drop(source,target) actions.perform()
執行JavaScript(一個比較萬能的方法)
在作一些元素交互動做的時候,可能有一些動做沒有提供api,好比進度條下拉,直接用api實現有難度,能夠經過實行js來實現
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
browser.execute_script('js語句')
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.taobao.com') browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') browser.execute_script('alert("down")')
獲取元素信息
獲取屬性
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.taobao.com') ele1 = browser.find_element_by_class_name('btn-search') print(ele1) print(ele1.get_attribute('class')) 輸出結果爲: <selenium.webdriver.remote.webelement.WebElement (session="a11d0c26dd60c650a15f84340c85bef4", element="0.1796961286323151-1")> btn-search tb-bg
獲取文本值
ele1.text
獲取ID,位置,標籤名,大小
ele1.id
ele1.location
ele1.tag_name
ele1.size
Frame
至關於獨立的網頁,在父級frame中查找子集frame中的元素,須要切換到子集中的frame,不然不能進行查找,一樣在子frame中也不能查找父frame
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException browser = webdriver.Chrome() browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') browser.switch_to.frame('iframeResult') source = browser.find_element_by_css_selector('#draggable') print(source) try: logo = browser.find_element_by_class_name('logo') except NoSuchElementException: print('NO LOGO') browser.switch_to.parent_frame() logo = browser.find_element_by_class_name('logo') print(logo) print(logo.text)
等待
在作爬去的時候,可能有一些ajax請求,它不會管selenium(只加載一些基本的框架)是否加載完成,這樣操做的話可能會引起一些問題,因此須要加一些等待,確保元素加載完畢
隱式等待
當使用了隱式等待執行測試的時候,若是webdriver沒有在DOM中找到元素,將繼續等待,超出設定時間後拋出異常,也就是說當元素沒有當即顯現的時候,隱式等待將等待一段時間再查找DOM,默認的時間是0,在網速慢的狀況下,能夠加個等待
from selenium import webdriver browser = webdriver.Chrome() #設定隱式等待的時間 browser.implicitly_wait(10) browser.get('http://www.baidu.com')
顯式等待
指定一個等待條件,再指定一個最長等待時間
瀏覽器的前進後退
from selenium import webdriver import time browser = webdriver.Chrome() browser.get('http://www.baidu.com') browser.get('http://www.taobao.com') browser.get('http://www.python.org') browser.back() time.sleep(1) browser.forward() browser.close()
cookies
在爬去過程比較有用,尤爲是在作一些登錄以後的爬去時
選項卡管理
最好的方法就是經過執行js命令window.open()來打開一個新的選項卡
browser.execute_script('window.open()')
異常處理