python爬蟲---從零開始(六)Selenium庫

什麼是Selenium庫:javascript

  自動化測試工具,支持多種瀏覽器。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。php

爬蟲中主要用來解決JavaScript渲染的問題。用於驅動瀏覽器,而且給予瀏覽器動做。css

安裝Selenium庫:pip3 install seleniumhtml

Selcnium庫的使用詳解:java

  在使用以前咱們須要安裝webDriver驅動,具體安裝方式,自行百度,切記版本對應。python

  基本使用:jquery

#!/usr/bin/env python # -*- coding: utf-8 -*- # 基本用法
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait browser = webdriver.Chrome() try: browser.get("http://www.baidu.com") input = browser.find_element_by_id('kw') input.send_keys('Python') input.send_keys(Keys.ENTER) wait = WebDriverWait(browser, 10) wait.until(EC.presence_of_element_located((By.ID,'content_left'))) print(browser.current_url) print(browser.get_cookies()) print(browser.page_source) finally: browser.close()

若是這段代碼能夠運行,說明你的webDriver版本正確(須要安裝Google瀏覽器)git

運行結果:web

  聲明瀏覽器對象:api

剛纔咱們說了Selenium支持多瀏覽器,下面我看下分別怎麼進行聲明

#!/usr/bin/env python # -*- coding: utf-8 -*- # 聲明瀏覽器對象
from selenium import webdriver browser = webdriver.Chrome() browser = webdriver.Safari() browser = webdriver.Edge() browser = webdriver.Firefox() browser = webdriver.PhantomJS()

我這裏沒有安裝那些瀏覽器,就不給你們運行代碼了,建議使用Chrome瀏覽器(Google谷歌瀏覽器)

訪問頁面:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 訪問頁面
from selenium import webdriver browser = webdriver.Chrome() browser.get("http://baidu.com") print(browser.page_source) browser.close()

運行結果:

查找元素:

  單個元素:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 查找元素,單個元素
from selenium import webdriver browser = webdriver.Chrome() browser.get("http://taobao.com") input_first = browser.find_element_by_id('q') input_second = browser.find_element_by_css_selector('#q') input_three = browser.find_element_by_xpath('//*[@id="q"]') print(input_first) print(input_second) print(input_three) browser.close()

運行結果:

  • 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

這些都爲查找方式

也能夠用通用方式來查找:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 查找元素,單個元素
from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get("http://taobao.com") input_first = browser.find_element(By.ID,'q') print(input_first) browser.close()

運行結果:

多個元素:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 查找元素,多個元素
from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get("http://taobao.com") input_first = browser.find_elements_by_css_selector('.service-bd li') for i in input_first: print(i) browser.close()

運行結果:

還有不少方法和find_elment用法徹底一致,返回一個列表數據。

元素交互操做:

對獲取的元素調用交互方法:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 元素交互操做

from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get("http://baidu.com") input_first = browser.find_element(By.ID,'kw') input_first.send_keys('python從入坑到放棄') button = browser.find_element_by_class_name('bg s_btn') button.click()

運行代碼咱們會看到打開Chrome瀏覽器,而且輸入要搜索的內容,而後點擊搜索按鈕。更多操做訪問地址:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement

交互操做:

將動做附加到動做鏈中串行執行

#!/usr/bin/env python # -*- coding: utf-8 -*- # 交互操做
from selenium import webdriver from selenium.webdriver import ActionChains browser = webdriver.Chrome() url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult') source = browser.find_element_by_id('draggable') target = browser.find_element_by_id('droppable') actions = ActionChains(browser) actions.drag_and_drop(source, target) actions.perform()

運行代碼咱們會看到內部的滑塊進行了拖拽操做。更多詳細的操做能夠訪問:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

執行Javascript:⭐️⭐️⭐️⭐️⭐️

#!/usr/bin/env python # -*- coding: utf-8 -*- # 執行javascript
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') browser.execute_script('alert("彈出")')

運行代碼咱們能夠看到,滾動條被下拉,而且給予了彈出框。

獲取元素信息:

  獲取屬性:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 獲取元素信息:獲取屬性
from selenium import webdriver browser = webdriver.Chrome() url = "http://www.zhihu.com/explore" browser.get(url) logo = browser.find_element_by_id('zh-top-link-logo') print(logo) print(logo.get_attribute('class'))

運行結果:

獲取文本值:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 獲取文本值
from selenium import webdriver browser = webdriver.Chrome() url = "http://www.zhihu.com/explore" browser.get(url) question = browser.find_element_by_class_name('zu-top-add-question') print(question.text)

運行結果:

獲取ID,位置,標籤名,大小:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 獲取ID,位置,標籤名,大小
from selenium import webdriver browser = webdriver.Chrome() url = "http://www.zhihu.com/explore" browser.get(url) question = browser.find_element_by_class_name('zu-top-add-question') print(question.id) print(question.location) print(question.tag_name) print(question.size)

運行結果:

Frame:

#!/usr/bin/env python # -*- coding: utf-8 -*- # Frame
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException browser = webdriver.Chrome() url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult') source = browser.find_element_by_id('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)

運行結果:

等待:

隱式等待 :

當使用了隱式等待執行測試的時候,若是WebDriver沒有在DOM中找到元素,將繼續等待,超出設定時間則拋出找不到元素的異常,換句話來講,當元素或查找元素沒有當即出現的時候,隱式等待將等待一段時間再查找DOM,默認時間是0

#!/usr/bin/env python # -*- coding: utf-8 -*- # 隱式等待
from selenium import webdriver browser = webdriver.Chrome() url = "http://www.zhihu.com/explore" browser.get(url) input = browser.find_element_by_class_name('zu-top-add-question') print(input)

運行結果:

顯示等待:比較經常使用

#!/usr/bin/env python # -*- coding: utf-8 -*- # 顯示等待
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait browser = webdriver.Chrome() browser.get("http://www.taobao.com") wait = WebDriverWait(browser, 10) 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)
  • title_is 標題是某內容
  • title_contains 標題包含某內容
  • presence_of_element_located 元素加載出,傳入定位元祖,如(By.ID,'p')
  • visibility_of_element_located 元素可見,傳入定位元祖
  • visibility_of 可見,傳入元素對象
  • presence_of_all_elements_located 全部元素加載出
  • text_to_be_present_in_element 某個元素文本包含某文字
  • text_to_be_present_in_element_value 某個元素值包含某文字
  • frame_to_be_available_and_switch_to_it 加載並切換
  • invisibility_of_element_located 元素不可見
  • element_to_be_clickable 元素可點擊
  • staleness_of 判斷一個元素是否仍在DOM,可判斷頁面是否已經刷新
  • element_to_be_selected 元素可選擇,傳元素對象
  • element_located_to_be_selected 元素能夠選擇,傳入定位元祖
  • element_selection_state_to_be 傳入元素對象以及狀態,相等返回True,不然返回False
  • element_located_selection_state_to_be 傳入定位元祖以及狀態,相等返回True,不然返回False
  • alert_is_present 是否出現Alert

  詳細內容,能夠閱讀官方地址:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

前進和後退:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 前進和後退
from selenium import webdriver browser = webdriver.Chrome() browser.get("http://www.taobao.com") browser.get("http://www.baidu.com") browser.get("http://www.zhihu.com") browser.back() browser.forward()

運行代碼咱們會看到優先你們taobao.com而後打開baidu.com,最後打開zhihu.com,而後執行退回動做和前進動做

Cookies:

#!/usr/bin/env python # -*- coding: utf-8 -*- # Cookies
from selenium import webdriver browser = webdriver.Chrome() browser.get("http://www.zhihu.com") print(browser.get_cookies()) browser.add_cookie({'name':'admin','domain':'www.zhihu.com','value':'cxiaocai'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies())

運行結果:

選項卡管理:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 選項卡管理
from selenium import webdriver browser = webdriver.Chrome() browser.get("http://www.baidu.com") browser.execute_script('window.open()') print(browser.window_handles) browser.switch_to.window(browser.window_handles[1]) browser.get('http://www.taobao.com') browser.switch_to.window(browser.window_handles[0]) browser.get('http://www.zhihu.com')

也可使用瀏覽器的快捷方式的操做鍵位來打開窗口(不建議這樣使用,建議使用上面的方式來管理選項卡)

異常處理:

#!/usr/bin/env python # -*- coding: utf-8 -*- # 異常處理
from selenium import webdriver from selenium.common.exceptions import TimeoutException,NoSuchElementException browser = webdriver.Chrome() try: browser.get("http://www.baidu.com") except TimeoutException: print("請求超時") try: browser.find_element_by_id('hello') except NoSuchElementException: print("NoSuchElementException")

運行結果:

因爲異常處理比較複雜,異常也有不少,在這裏不在一一列舉了,建議你們去官網查看,地址:https://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions  

上述代碼地址:https://gitee.com/dwyui/senlenium.git

到這裏Selenium庫的使用就說完了,python用於爬蟲的庫就說了這麼多,前面的urllib,Requests,BeautfuliSoup,PyQuery還有今天的Selenium庫,明天開始直接講解真實案例,最近我會整理幾個簡單的小爬蟲案例。