
官網(wǎng)文檔
Selenium 官方參考文檔:http://selenium-python.readthedocs.io/index.html
安裝
安裝客戶端
pip install selenium
或
PyPI 網(wǎng)站下載 Selenium庫(kù)https://pypi.python.org/simple/selenium
安裝瀏覽器驅(qū)動(dòng)
下載谷歌瀏覽器
下載瀏覽器驅(qū)動(dòng)
https://chromedriver.storage.googleapis.com/index.html
我的存放位置D:\webdrivers\chromedriver.exe
browser = webdriver.Chrome(r'C:\webdrivers\chromedriver.exe')
或
下載解壓好的chromediver.exe文件放進(jìn)python安裝路徑下的scripts文件夾里
browser = webdriver.Chrome()
irefox瀏覽器驅(qū)動(dòng):geckodriver
Chrome瀏覽器驅(qū)動(dòng):chromedriver,taobao備用地址
IE瀏覽器驅(qū)動(dòng):IEDriverServer
Edge瀏覽器驅(qū)動(dòng):MicrosoftWebDriver
Opera瀏覽器驅(qū)動(dòng):operadriver
PhantomJS瀏覽器驅(qū)動(dòng):phantomjs
3個(gè)檢測(cè)瀏覽器User-Agent信息的網(wǎng)站為:
代碼
導(dǎo)入的包
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time
from selenium.webdriver.chrome.options import Options
指定瀏覽器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options() # 網(wǎng)上找到 你可以試試
options.binary_location = "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe" # 這里是你指定瀏覽器的路徑
driver = webdriver.Chrome(chrome_options=options)
driver.get('http://www.baidu.com')
帶界面
from selenium import webdriver
## 創(chuàng)建 WebDriver 對(duì)象,指明使用chrome瀏覽器驅(qū)動(dòng)
browser= webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
# 調(diào)用WebDriver 對(duì)象的get方法 可以讓瀏覽器打開指定網(wǎng)址
browser.get('https://www.baidu.com')
不帶界面
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options=Options()
#不帶界面
chrome_options.add_argument('--headless')
#不加載圖片
chrome_options.add_argument('blink-settings=imagesEnabled=false')
browser = webdriver.Chrome(r'C:\webdrivers\chromedriver.exe',options=self.chrome_options)
browser.get('https://www.baidu.com')
讀取和使用cookies
選擇元素的基本方法
# 獲取id標(biāo)簽值
element = driver.find_element_by_id("passwd-id")
# 獲取name標(biāo)簽值
element = driver.find_element_by_name("user-name")
# 獲取標(biāo)簽名值
element = driver.find_elements_by_tag_name("input")
# 也可以通過(guò)XPath來(lái)匹配
element = driver.find_element_by_xpath("http://input[@id='passwd-id']")
find_element_by_xpath()用法
find_element_by_xpath('//ul/li').text #獲取文本
find_element_by_xpath('//ul/li').get_attribute("href") #獲取去元素,獲取href元素
補(bǔ)充
find_elements_by_link_text (全部文本)
find_elements_by_partial_link_text (包含某個(gè)文本)
ID屬性選擇元素
find_element_by_id("id名") //符合條件所有ID名
find_elements_by_id("id名") //符合條件第一個(gè)ID名class屬性選擇元素
find_elements_by_class_name('類名') //符合條件所有類名
find_element_by_class_name('類名') //符合條件第一個(gè)類名tag名選擇元素
find_elements_by_tag_name('div') //選擇所有的tag名為 div的元素
find_element_by_tag_name('div') //選擇第一個(gè)tag名為div的元素css選擇元素
find_element_by_css_selector(CSS Selector參數(shù))
find_elements_by_css_selector(CSS Selector參數(shù))
CSS Selector用法
CSS Selector 同樣可以根據(jù)tag名、id 屬性和 class屬性 來(lái) 選擇元素
#取tag名
find_elements_by_css_selector('div')
#取id
find_element_by_css_selector('#id') #加#號(hào)
#取class
find_elements_by_css_selector('.class') #加.號(hào)
#其他屬性
find_element_by_css_selector('[)
find_element_by_css_selector("div[class='SKnet']") #div標(biāo)簽class值
find_element_by_css_selector('a[href*="miitbeian"]') #a標(biāo)簽href包含的值
find_element_by_css_selector('a[href^="http"]') #a標(biāo)簽href以http開頭
find_element_by_css_selector('a[href$="gov.cn"]') #a標(biāo)簽href以gov.cn結(jié)尾
#<div class="misc" ctype="gun">沙漠之鷹</div>
find_element_by_css_selector('div[class=misc][ctype=gun]') #一個(gè)標(biāo)簽多個(gè)屬性
CSS Selector選擇語(yǔ)法聯(lián)合使用
更多CSS選擇器:https://www.w3school.com.cn/cssref/css_selectors.asp
選擇下級(jí)
#選擇 一個(gè)class 屬性值為 copyright 的 span 節(jié)點(diǎn),
#并且要求其 必須是 class 屬性值為 footer1 的 div節(jié)點(diǎn) 的子節(jié)點(diǎn)
div.footer1 > span.copyright
#也可以更簡(jiǎn)單
.footer1 > .copyright
#或
.footer1 .copyright
同時(shí)選擇
#同時(shí)選擇所有class 為 plant 和 class 為 animal 的元素
'.plant , .animal'
#同時(shí)選擇所有tag名為div的元素 和 id為BYHY的元素
'div,#BYHY'
#選擇所有 id 為 t1 里面的 span 和 p 元素
'#t1 > span , #t1 > p'
#對(duì)應(yīng)的代碼如下
elements = wd.find_elements_by_css_selector('div,#BYHY')
for element in elements:
print(element.text)
按次序選擇子節(jié)點(diǎn)
#指定選擇的元素 是父元素的第幾個(gè)子節(jié)點(diǎn)
span:nth-child(2) #第2個(gè)子元素,并且是span類型
#指定選擇的元素 是父元素的倒數(shù)第幾個(gè)子節(jié)點(diǎn)
p:nth-last-child(1) #倒數(shù)2個(gè)子元素,并且是span類型
#父元素的第幾個(gè) 某類型的 子節(jié)點(diǎn)
span:nth-of-type(1) #選擇的是 第1個(gè)span類型 的子元素
#父元素的 倒數(shù)第幾個(gè)某類型 的子節(jié)點(diǎn)
p:nth-last-of-type(2) #選擇的是 倒數(shù)第1個(gè)span類型 的子元素
#父元素的 偶數(shù)節(jié)點(diǎn),使用 nth-child(even)
p:nth-child(even) 父元素的 偶數(shù)節(jié)點(diǎn)
span:nth-of-type(even) #某類型偶數(shù)節(jié)點(diǎn)
#如果要選擇的是父元素的 奇數(shù)節(jié)點(diǎn),使用 nth-child(odd)
p:nth-child(odd) #父元素的 奇數(shù)節(jié)點(diǎn)
p:nth-last-of-type(odd) #某類型奇數(shù)節(jié)點(diǎn)

兄弟節(jié)點(diǎn)選擇
#相鄰兄弟 關(guān)系,可以這樣寫 h3 + span
#表示元素 緊跟關(guān)系的 是 加號(hào)
#選擇 h3 后面所有的兄弟節(jié)點(diǎn) span,可以這樣寫 h3 ~ span
text //取文本內(nèi)容
clear() //清除輸入框已有的字符串
send_keys('輸入內(nèi)容') //輸入新的字符串
click() //點(diǎn)擊
獲取元素內(nèi)容
element = wd.find_element_by_id('input_name')
print(element.get_attribute('class'))
get_attribute('class') //獲取元素的值
get_attribute('outerHTML') //獲取整個(gè)元素對(duì)應(yīng)的HTML文本內(nèi)容
get_attribute('innerHTML') //獲取某個(gè)元素內(nèi)部的HTML文本內(nèi)容
get_attribute('value') //獲取輸入框的文本(input輸入框文本)//有時(shí)候,元素的文本內(nèi)容沒(méi)有展示在界面上,或者沒(méi)有完全完全展示在界面上。 這時(shí),用WebElement對(duì)象的text屬性,獲取文本內(nèi)容,就會(huì)有問(wèn)題。
(get_attribute('innerText') 或 get_attribute('textContent'))
find_element 和 find_elements 的區(qū)別
使用
find_elements選擇的是符合條件的所有元素, 如果沒(méi)有符合條件的元素,返回空列表使用
find_element選擇的是符合條件的第一個(gè)元素, 如果沒(méi)有符合條件的元素,拋出 NoSuchElementException 異常
通過(guò)WebElement對(duì)象選擇元素
- 不僅 WebDriver對(duì)象有 選擇元素 的方法, WebElement對(duì)象 也有選擇元素的方法
- WebElement對(duì)象 也可以調(diào)用 find_elements_by_xxx,find_element_by_xxx 之類的方法
- WebDriver 對(duì)象 選擇元素的范圍是 整個(gè) web頁(yè)面, 而WebElement 對(duì)象 選擇元素的范圍是 該元素的內(nèi)部。
from selenium import webdriver
wd = webdriver.Chrome(r'd:\webdrivers\chromedriver.exe')
wd.get('http://cdn1.python3.vip/files/selenium/sample1.html')
element = wd.find_element_by_id('container')
# 限制 選擇元素的范圍是 id 為 container 元素的內(nèi)部。
spans = element.find_elements_by_tag_name('span')
for span in spans:
print(span.text)
等待界面出現(xiàn)
implicitly_wait如果找不到元素, 每隔 半秒鐘 再去界面上查看一次, 直到找到該元素, 或者 過(guò)了10秒 最大時(shí)長(zhǎng)
from selenium import webdriver
wd = webdriver.Chrome()
# 設(shè)置最大等待時(shí)長(zhǎng)為 10秒
wd.implicitly_wait(10)
wd.get('https://www.baidu.com')
element = wd.find_element_by_id('kw')
element.send_keys('黑羽魔巫宗\n')
element = wd.find_element_by_id('1')
print (element.text)
異常結(jié)束
NoSuchElementException的意思就是在當(dāng)前的網(wǎng)頁(yè)上 找不到該元素
frame切換/窗口切換
使用 WebDriver 對(duì)象的 switch_to 屬性,像這樣
frame_reference可以是 frame 元素的屬性name或者ID。
wd.switch_to.frame(`frame_reference`)
也可以根據(jù)frame的元素位置或者屬性獲取
wd.switch_to.frame(wd.find_element_by_tag_name("iframe"))
切換回主html
wd.switch_to.default_content()
切換到新的窗口
在網(wǎng)頁(yè)上操作的時(shí)候,我們經(jīng)常遇到,點(diǎn)擊一個(gè)鏈接 或者 按鈕,就會(huì)打開一個(gè) 新窗口 。
from selenium import webdriver
browser = webdriver.Chrome(r'C:\webdrivers\chromedriver.exe')
browser.get('http://cdn1.python3.vip/files/selenium/sample3.html')
link = browser.find_element_by_tag_name("a")
link.click()
#mainWindow變量保存當(dāng)前窗口的句柄
mainWindow = browser.current_window_handle
for handle in browser.window_handles:
browser.switch_to.window(handle)
if 'Bing' in browser.title:
break
print(browser.title)
browser.switch_to.window(mainWindow)
print(browser.title)