1. 程式人生 > >python爬蟲筆記----4.Selenium庫(自動化庫)

python爬蟲筆記----4.Selenium庫(自動化庫)

locate pri 官方文檔 input 顯式 ref 打開網頁 elements timeout

4.Selenium庫

(自動化測試工具,支持多種瀏覽器,爬蟲主要解決js渲染的問題)

pip install selenium

基本使用

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(https://www.baidu.com) input = browser.find_element_by_id(kw)#通過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()

聲明瀏覽器對象

#聲明瀏覽器對象(其他可查看官方文檔)
from selenium import webdriver
browser = webdriver.Chrome()#生成Chrome瀏覽器對象
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser 
= webdriver.PhantomJS() browser = webdriver.Safari()

訪問頁面

#訪問頁面
from selenium import webdriver
browser = webdriver.Chrome()
browser.get(https://www.taobao.com)
print(browser.page_source)#獲取頁面代碼
browser.close()#關閉頁面

查找元素

  查找單個元素

#查找單個元素
from selenium import webdriver
browser = webdriver.Chrome()
browser.get(https://www.taobao.com)
input_first = browser.find_element_by_id(q)#通過id
input_second = browser.find_element_by_css_selector(#q)#通過css選擇器
input_third = browser.find_element_by_xpath(//*[@id="q"])#通過xpath
print(input_first, input_second, input_third)
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

      也可以使用通用方法

input_first = browser.find_element(By.ID, q)

  查找多個元素

#查找多個元素
lis = browser.find_elements_by_css_selector(.service-bd li)#其他也類似單個元素的查找方法,find_element_*變為find_elements_*
lis = browser.find_elements(By.CSS_SELECTOR, .service-bd li)#也可以使用這種通用的

元素交互操作

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

browser = webdriver.Chrome()
browser.get(https://www.taobao.com)
input = browser.find_element_by_id(q)#定位輸入框(id=‘q‘)
input.send_keys(iPhone)#在搜索框輸入iPhone
time.sleep(1)
input.clear()#清除搜索框
input.send_keys(iPad)#在搜索框輸入iPad
button = browser.find_element_by_class_name(btn-search)#定位搜索按鈕
button.click()#點擊搜索按鈕

  更多操作: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement

(報錯可能是chrome版本和chromedriver版本不匹配)

交互動作

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

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)#定位frame標簽
source = browser.find_element_by_css_selector(#draggable)#定位到frame標簽裏的draggable
target = browser.find_element_by_css_selector(#droppable)
actions = ActionChains(browser)#動作鏈對象
actions.drag_and_drop(source, target)#把source拖拽到target上面
actions.perform()#執行動作

  更多操作: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

執行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("To Bottom"))#彈出alert提示框

獲取元素信息 

  獲取屬性值,文本值,id,位置,標簽名,大小

from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = https://www.zhihu.com/explore
browser.get(url)
logo = browser.find_element_by_id(zh-top-link-logo)
input = browser.find_element_by_class_name(zu-top-add-question)
print(logo.get_attribute(class))#獲取屬性值
print(logo.text)#獲取文本值
print(logo.id)#獲取id
print(logo.location)#獲取位置
print(logo.tag_name)#獲取標簽名
print(logo.size)#獲取大小

Frame

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome()
url = http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
browser.get(url)
browser.switch_to.frame(iframeResult)#定位到frame
source = browser.find_element_by_css_selector(#draggable)#定位到frame裏的選擇器
try:
    logo = browser.find_element_by_class_name(logo)
except NoSuchElementException:
    print(NO LOGO)
browser.switch_to.parent_frame()#切換到父frame
logo = browser.find_element_by_class_name(logo)
print(logo.text)

等待

   隱式等待(當使用了隱式等待執行測試的時候,如果 WebDriver沒有在 DOM中找到元素,將繼續等待,超出設定時間後則拋出找不到元素的異常, 換句話說,當查找元素或元素並沒有立即出現的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是0)(沒有太大必要)

from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get(https://www.zhihu.com/explore)
input = browser.find_element_by_class_name(zu-top-add-question)#如果元素加載出來則不會等待,沒有加載出來則等待10秒
print(input)

  顯式等待

  (如果沒有加載出來則一直等待)

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)
  • 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 frame加載並切換
  • 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

    詳細內容:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

前進後退

import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get(https://www.baidu.com/)#打開百度
browser.get(https://www.taobao.com/)#打開淘寶
browser.back()#返回上一步(返回到百度)
time.sleep(1)
browser.forward()#前進(返回淘寶)
browser.close()

Cookies

from selenium import webdriver
browser = webdriver.Chrome()
browser.get(https://www.zhihu.com/explore)
print(browser.get_cookies())#打印cookie
browser.add_cookie({name: name, domain: www.zhihu.com, value: germey})#添加cookie
print(browser.get_cookies())#打印cookie
browser.delete_all_cookies()#清空cookie
print(browser.get_cookies())#打印

選項卡管理

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])#選擇到第二個選項卡
browser.get(https://www.taobao.com)#打開淘寶
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])#選擇到第一個選項卡
browser.get(http://www.hao123.com)#打開網頁

異常處理

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

python爬蟲筆記----4.Selenium庫(自動化庫)