1.聲明瀏覽器對象php
selenium支持多個瀏覽器,也支持手機端的瀏覽器,除此以外還有Phantomjs,下面舉一個簡單的例子,建立一個谷歌瀏覽器對象,依次類推能夠獲得其餘瀏覽器對象css
from selenium import webdriverpython
chrome_driver = "C:\Users\zhongchengbin\Documents\chromedriver\chromedriver.exe"(注意要下載對應的chrome的版本,設置路徑)
browser = webdriver.Chrome(executable_path=chrome_driver)
2.請求頁面jquery
# 使用get方法請求百度網頁
browser.get('https://www.baidu.com')
# page_source屬性用於獲取網頁的源代碼,而後就可使用正則表達式,css,xpath,bs4來解析網頁
print(browser.page_source)
browser.close()
3.查找單個節點和多個節點web
尋找單個節點的多有方法,返回的結果是WebElement類型的
browser.find_element_by_id()
browser.find_element_by_name()
browser.find_element_by_xpath()
browser.find_element_by_tag_name()
browser.find_element_by_link_text()
browser.find_element_by_class_name()
browser.find_element_by_css_selector()
browser.find_element_by_partial_link_text()
若是是找多個節點,在element後面加s,結果是列表類型正則表達式
當咱們要定位到百度的搜索框時,咱們能夠看到,檢查元素中,input這個節點裏有class,id 等等屬性,咱們經過定位相關屬性,就能定位到想要的節點chrome
from selenium import webdriver
chrome_driver = "C:\Users\zhongchengbin\Documents\chromedriver\chromedriver.exe"(注意要下載對應的chrome的版本,設置路徑)api
browser = webdriver.Chrome(executable_path=chrome_driver)
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
browser.close()
4模擬瀏覽器進行操做瀏覽器
在打開瀏覽器以後,咱們每每須要在一些搜索框裏輸入文字,刪除文字,點擊一些按鈕等等,這時咱們須要用到一下幾種方法cookie
send_keys():輸入文字
clear():清除文字
click():點擊按鈕
舉個例子,咱們打開百度瀏覽器,而後輸入一些關鍵字,刪除,再次輸入一些關鍵字,而後點擊回車而後搜索
import time
from selenium import webdriver
chrome_driver = "C:\Users\zhongchengbin\Documents\chromedriver\chromedriver.exe"(注意要下載對應的chrome的版本,設置路徑)
browser = webdriver.Chrome(executable_path=chrome_driver)
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('許嵩')
time.sleep(3)
input.clear()
input.send_keys('python')
input.send_keys(Keys.ENTER)
# button = browser.find_element_by_class_name('btn self_btn')
# button.click()
browser.close()
5.模擬鼠標移動,鍵盤按鍵等沒有特定的執行對象的操做
模擬瀏覽器的時候,咱們可能會使用到一些拖動的操做,好比須要將某一個點拖到另一個地方去,這種方法咱們能夠稱之爲動做鏈。
首先打開網頁http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable中的一個實例,選中要拖動的節點以及拖動到哪裏的節點,使用ActionChains對象使它變成一個變量,再調用drag_and_drop方法以及perform方法來執行該過程。
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('http:www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframeResult')
yuanlai = browser.find_element_by_css_selector('#draggable')
mubiao = browser.find_element_by_css_selector('#droppable')
a = ActionChains(browser)
a.drag_and_drop(yuanlai,mubiao)
a.perform()
6.拖動滑動條
使用爬蟲爬取網頁時,常常會看到使用滑動條的頁面,而後會顯示加載中,沒多久就會加載出新的頁面出來。若是直接爬取,每每只能爬到一頁甚至是前幾頁的信息。
在此能夠直接模擬運行JavaScript,滑到網頁的最底下。使用的是execute_script(),而且能夠設置一個網頁提示框
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.toutiao.com/search/?keyword=街拍')
# execute_script()將進度條拉到最下面,而後彈出提示框
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
browser.execute_script('alert("已經到最下面了")')
7.獲取節點信息
獲取節點信息與兩種方法,第一種是使用page_source屬性,獲取到目標網頁的源代碼以後,使用正則表達式,css,xpath ,bs4等工具進行抓取信息。第二種就是直接使用selenium的一些方法和屬性。
① 獲取屬性
首先選中要匹配解析的節點,而後調用get_attribute方法來獲取節點的屬性。
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
print(input.get_attribute('class'))
② 獲取文本
依然是先代開網址,而後定位到目標節點,再使用text屬性來獲取文本
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
print(input.text)
③ 獲取ID,位置,標籤名和大小
方法和前兩個相似,直接調用便可得到相關的值
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
# 獲取節點id
print(input.id)
# 獲取節點在頁面的相對位置
print(input.location)
# 獲取節點標籤名稱
print(input.tag_name)
# 獲取節點大小
print(input.size)
8.切換frame
網頁有一種很常見的節點叫作iframe,至關因而子frame,也就是頁面的子頁面。
結構和外部網頁的結構一致,當咱們使用selenium打開頁面,默認是在父頁面裏執行的,可是呢,這種網頁咱們每每是獲取不到子頁面的節點,因此要使用switch_to.frame()來跳轉頁面,而後再進行相對應的操做
而後嘗試獲取父頁面的某個節點,若是獲取不到就報錯,接下來就換回父頁面去獲取該節點,就能成功了。
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome
browser.get('https://www.toutiao.com')
browser.switch_to.frame('tanxssp-tuwen-iframemm')#具體是什麼,要看節點frame的id是什麼
try:
title = browser.find_element_by_id('tanx-a-mm_32479643_3494618_81668314')
except NoSuchElementException:
print('沒有這個節點')
browser.switch_to.parent_frame()
title = browser.find_element_by_id('tanx-a-mm_32479643_3494618_81668314')
print(title)
print(title.text)
9.延時等待
有些時候,網頁有額外的Ajax請求,並無那麼快就能加載出來,因此咱們要有耐心地等待一下。
等待分爲兩種,隱式等待和顯式等待
隱式等待,查找某個節點的時候,隱式等待就會等待固定的時間,若是到了時間你尚未來,他就會發脾氣,而後向上級打小報告說你沒有出現。
from selenium import webdriver
browser = webdriver.Chrome
browser.implicitly_wait(10)
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
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')
# 引入WWebDriverWait對象,指定等待的最長時間
wait = WebDriverWait(browser,10)
# 調用unti方法,而後設定等待的條件,表示直到這個節點出現的意思。參數是節點的定位元組,也就是說ID爲q的節點搜索框
# 成功就返回,不成功就拋出異常
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 節點加載出來,傳入定位元組
visibility_of_element_located 節點可見,傳入定位元組
visibility_of 可見,傳入節點對象
presence_of_all_element_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 是否出現警告
'''
10.後退前進
使用瀏覽器都有前進後退的功能,在selenium中,back()表示後退,forward()表示前進
# 後退前進
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser .get('https://www.baidu.com')
browser.back()
time.sleep(3)
browser.forward()
browser.close()
11.獲取cookies
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
print(browser.get_cookies())
browser.add_cookie({'name':'name','domain':'www.baidu.com','value':'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
12.選項卡管理
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.baidu.com') # window.open()新開啓一個選項卡 browser.execute_script('window.open()') # window_handles 用於獲取當前開啓的全部選項卡,返回的是選項卡的代號列表 print(browser.window_handles) # switch_to_window用於切換選項卡 browser.switch_to_window(browser.window_handles[1]) browser.get('https://www.taobao.com') time.sleep(3) browser.switch_to_window(browser.window_handles[0]) browser.get('https://python.org')