Python中Selenium庫使用教程詳解
selenium介紹
selenium最初是一個(gè)自動(dòng)化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執(zhí)行JavaScript代碼的問題 selenium本質(zhì)是通過驅(qū)動(dòng)瀏覽器,完全模擬瀏覽器的操作,比如跳轉(zhuǎn)、輸入、點(diǎn)擊、下拉等,來拿到網(wǎng)頁渲染之后的結(jié)果,可支持多種瀏覽器
環(huán)境安裝
下載安裝selenium
pip install selenium -i https://mirrors.aliyun.com/pypi/simple/
谷歌瀏覽器驅(qū)動(dòng)程序下載地址:
http://chromedriver.storage.googleapis.com/index.html
使用示例
from selenium import webdriver
from time import sleep
# 實(shí)例化一款瀏覽器
bor = webdriver.Chrome(executable_path='chromedriver.exe')
# 對指定的url發(fā)起請求
bor.get('https://www.jd.com/')
sleep(1)
# 進(jìn)行標(biāo)簽定位
search_input = bor.find_element_by_id('key')
# 向搜索框中錄入關(guān)鍵詞
search_input.send_keys("mac pro")
# 點(diǎn)擊搜索按鈕
btn = bor.find_element_by_xpath('//*[@id="search"]/div/div[2]/button')
btn.click()
sleep(2)
# 執(zhí)行js,讓滾輪向下滾動(dòng)
bor.execute_script('window.scrollTo(0, document.body.scrollHeight)')
sleep(2)
page_text = bor.page_source
print(page_text)
bor.quit()
瀏覽器創(chuàng)建
Selenium支持非常多的瀏覽器,如Chrome、Firefox、Edge等,還有Android、BlackBerry等手機(jī)端的瀏覽器。另外,也支持無界面瀏覽器PhantomJS。
from selenium import webdriver browser = webdriver.Chrome() browser = webdriver.Firefox() browser = webdriver.Edge() browser = webdriver.PhantomJS() browser = webdriver.Safari()
元素定位
webdriver 提供了一系列的元素定位方法,常用的有以下幾種:
| 定位一個(gè)元素 | 定位多個(gè)元素 | 含義 |
|---|---|---|
| find_element_by_id | find_elements_by_id | 通過元素id定位 |
| find_element_by_name | find_elements_by_name | 通過元素name定位 |
| find_element_by_xpath | find_elements_by_xpath | 通過xpath表達(dá)式定位 |
| find_element_by_link_text | find_elements_by_link_tex | 通過完整超鏈接定位 |
| find_element_by_partial_link_text | find_elements_by_partial_link_text | 通過部分鏈接定位 |
| find_element_by_tag_name | find_elements_by_tag_name | 通過標(biāo)簽定位 |
| find_element_by_class_name | find_elements_by_class_name | 通過類名進(jìn)行定位 |
| find_elements_by_css_selector | find_elements_by_css_selector | 通過css選擇器進(jìn)行定位 |
注意:
1、find_element_by_xxx找的是第一個(gè)符合條件的標(biāo)簽,find_elements_by_xxx找的是所有符合條件的標(biāo)簽。
2、根據(jù)ID、CSS選擇器和XPath獲取,它們返回的結(jié)果完全一致。
3、另外,Selenium還提供了通用方法find_element(),它需要傳入兩個(gè)參數(shù):查找方式By和值。實(shí)際上,它就是find_element_by_id()這種方法的通用函數(shù)版本,比如find_element_by_id(id)就等價(jià)于find_element(By.ID, id),二者得到的結(jié)果完全一致。
實(shí)例演示
假如有一個(gè)web頁面,通過前端工具查看到一個(gè)元素的屬性是這樣的。
<html>
<head>
<body link="#0000cc">
<a href="/" rel="external nofollow" onmousedown="return c({'fm':'tab','tab':'logo'})">
<form name="f" action="/s">
<span ></span>
<input name="wd" value="" maxlength="255" autocomplete="off">
通過id定位:
dr.find_element_by_id("kw")
通過name定位:
dr.find_element_by_name("wd")
通過class name定位:
dr.find_element_by_class_name("s_ipt")
通過tag name定位:
dr.find_element_by_tag_name("input")
通過xpath定位,xpath定位有N種寫法,這里列幾個(gè)常用寫法:
dr.find_element_by_xpath("http://*[@]")
dr.find_element_by_xpath("http://*[@name='wd']")
dr.find_element_by_xpath("http://input[@]")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("http://span[@]/input")
dr.find_element_by_xpath("http://form[@]/span/input")
dr.find_element_by_xpath("http://input[@ and @name='wd']")
通過css定位,css定位有N種寫法,這里列幾個(gè)常用寫法:
dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html > body > form > span > input")
dr.find_element_by_css_selector("span.soutu-btn> input#kw")
dr.find_element_by_css_selector("form#form > span > input")
假如頁面上有如下一組文本鏈接
<a rel="external nofollow" name="tj_trnews">新聞</a> <a rel="external nofollow" name="tj_trhao123">hao123</a>
通過link text定位:
dr.find_element_by_link_text("新聞")
dr.find_element_by_link_text("hao123")
通過partial link text定位:
dr.find_element_by_partial_link_text("新")
dr.find_element_by_partial_link_text("hao")
dr.find_element_by_partial_link_text("123")
控制瀏覽器
常用的控制瀏覽器操作的一些方法
| 方法 | 說明 |
|---|---|
| set_window_size() | 設(shè)置瀏覽器的大小 |
| back() | 控制瀏覽器后退 |
| forward() | 控制瀏覽器前進(jìn) |
| refresh() | 刷新當(dāng)前頁面 |
| clear() | 清除文本 |
| send_keys (value) | 模擬按鍵輸入 |
| click() | 單擊元素 |
| submit() | 用于提交表單 |
| get_attribute(name) | 獲取元素屬性值 |
| is_displayed() | 設(shè)置該元素是否用戶可見 |
| size | 返回元素的尺寸 |
| text | 獲取元素的文本 |
📝 示例
from selenium import webdriver
from time import sleep
#1.創(chuàng)建Chrome瀏覽器對象,這會(huì)在電腦上在打開一個(gè)瀏覽器窗口
browser = webdriver.Chrome(executable_path= "chromedriver.exe")
#2.通過瀏覽器向服務(wù)器發(fā)送URL請求
browser.get("https://www.baidu.com/")
sleep(3)
#3.刷新瀏覽器
browser.refresh()
#4.設(shè)置瀏覽器的大小
browser.set_window_size(1400,800)
#5.設(shè)置鏈接內(nèi)容
element=browser.find_element_by_link_text("新聞")
element.click()
調(diào)用JavaScript代碼
雖然WebDriver提供了操作瀏覽器的前進(jìn)和后退方法,但對于瀏覽器滾動(dòng)條并沒有提供相應(yīng)的操作方法。在這種情況下,就可以借助JavaScript來控制瀏覽器的滾動(dòng)條。WebDriver提供了execute_script()方法來執(zhí)行JavaScript代碼。
用于調(diào)整瀏覽器滾動(dòng)條位置的JavaScript代碼如下:
<!-- window.scrollTo(左邊距,上邊距); --> window.scrollTo(0,450);
from selenium import webdriver
from time import sleep
# 1.訪問百度
drive = webdriver.Chrome(executable_path='chromedriver.exe')
drive.get('https://www.baidu.com')
# 2.搜索
drive.find_element_by_id('kw').send_keys('python')
drive.find_element_by_id('su').click()
# 3.休眠2s,獲取服務(wù)器的響應(yīng)內(nèi)容
sleep(2)
# 4.通過javascript設(shè)置瀏覽器窗口的滾動(dòng)條位置
drive.execute_script('window.scrollTo(0, 500)')
# drive.execute_script('window.scrollTo(0, document.body.scrollHeight)') #滑到最底部
sleep(2)
drive.close()
獲取頁面源碼數(shù)據(jù)
通過page_source屬性可以獲取網(wǎng)頁的源代碼,接著就可以使用解析庫(如正則表達(dá)式、Beautiful Soup、pyquery等)來提取信息了。
📝 示例
from selenium import webdriver
from time import sleep
# 1.訪問百度
drive = webdriver.Chrome(executable_path='chromedriver.exe')
drive.get('https://www.baidu.com')
# 2.搜索
drive.find_element_by_id('kw').send_keys('python')
drive.find_element_by_id('su').click()
# 3.休眠2s,獲取服務(wù)器的響應(yīng)內(nèi)容
sleep(2)
# 4.獲取頁面源碼數(shù)據(jù)
text = drive.page_source
print(text)
drive.close()
cookie操作
有時(shí)候我們需要驗(yàn)證瀏覽器中cookie是否正確,因?yàn)榛谡鎸?shí)cookie的測試是無法通過白盒和集成測試進(jìn)行的。WebDriver提供了操作Cookie的相關(guān)方法,可以讀取、添加和刪除cookie信息。
WebDriver操作cookie的方法:
| 方法 | 說明 |
|---|---|
| get_cookies() | 獲得所有cookie信息 |
| get_cookie(name) | 返回字典的key為“name”的cookie信息 |
| add_cookie(cookie_dict) | 添加cookie?!癱ookie_dict”指字典對象,必須有name 和value 值 |
| delete_cookie(name,optionsString) | 刪除cookie信息?!皀ame”是要?jiǎng)h除的cookie的名稱,“optionsString”是該cookie的選項(xiàng),目前支持的選項(xiàng)包括“路徑”,“域” |
| delete_all_cookies() | 刪除所有cookie信息 |
📝 示例
from selenium import webdriver
drive = webdriver.Chrome(executable_path='chromedriver.exe')
drive.get('https://www.cnblogs.com/')
# 1.打印cookie信息
print(drive.get_cookies())
# 2.添加cookie信息
dic = {'name':'name', 'value':'python'}
drive.add_cookie(dic)
print(drive.get_cookies())
# 3.遍歷打印cookie信息
for cookie in drive.get_cookies():
print(f"{cookie['name']}---f{cookie['value']}\n")
drive.close()
谷歌無頭瀏覽器
PhantomJs已停止維護(hù)更新,這里使用谷歌的無頭瀏覽器,是一款無界面的谷歌瀏覽器。很多時(shí)候我們爬取數(shù)據(jù),并不想打開一個(gè)瀏覽器窗口進(jìn)行操作,我們只需要獲取數(shù)據(jù)或者拿到cookie然后進(jìn)行操作。
📝 示例
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 1.創(chuàng)建一個(gè)參數(shù)對象,用來控制chrome以無界面模式打開
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 2.創(chuàng)建瀏覽器對象
drive = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
# 3.發(fā)起請求獲取數(shù)據(jù)
drive.get('https://www.cnblogs.com/')
page_text = drive.page_source
print(page_text)
drive.close()
selenium規(guī)避被檢測識別
現(xiàn)在不少大網(wǎng)站有對selenium采取了監(jiān)測機(jī)制。比如正常情況下我們用瀏覽器訪問淘寶等網(wǎng)站的 window.navigator.webdriver的值為 undefined。而使用selenium訪問則該值為true。那么如何解決這個(gè)問題呢?
只需要設(shè)置Chromedriver的啟動(dòng)參數(shù)即可解決問題。在啟動(dòng)Chromedriver之前,為Chrome開啟實(shí)驗(yàn)性功能參數(shù)excludeSwitches,它的值為['enable-automation'],完整代碼如下:
📝 示例
from selenium import webdriver
from selenium.webdriver import ChromeOptions
# 1.實(shí)例化一個(gè)ChromeOptions對象
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
# 2.將ChromeOptions實(shí)例化的對象option作為參數(shù)傳給Crhome對象
driver = webdriver.Chrome(executable_path='chromedriver.exe', options=option)
# 3.發(fā)起請求
driver.get('https://www.taobao.com/')
到此這篇關(guān)于Python中Selenium庫使用教程詳解的文章就介紹到這了,更多相關(guān)Python Selenium庫使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python使用Selenium WebDriver的入門介紹及安裝教程(最新推薦)
- 新版selenium4.0 + Python使用詳解
- python使用selenium打開chrome瀏覽器時(shí)帶用戶登錄信息實(shí)現(xiàn)過程詳解
- Python編程使用Selenium模擬淘寶登錄實(shí)現(xiàn)過程
- python編程使用selenium編寫測試用例
- Python使用Selenium自動(dòng)進(jìn)行百度搜索的實(shí)現(xiàn)
- Python3使用Selenium獲取session和token方法詳解
- Python Selenium庫的基本使用教程
- Python中Selenium的基本使用步驟
相關(guān)文章
你知道怎么改進(jìn)Python 二分法和牛頓迭代法求算術(shù)平方根嗎
這篇文章主要介紹了Python編程實(shí)現(xiàn)二分法和牛頓迭代法求平方根代碼的改進(jìn),具有一定參考價(jià)值,需要的朋友可以了解下,希望能夠給你帶來幫助2021-08-08
Django 解決上傳文件時(shí),request.FILES為空的問題
這篇文章主要介紹了Django 解決上傳文件時(shí),request.FILES為空的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Pytorch結(jié)合PyG實(shí)現(xiàn)MLP過程詳解
這篇文章主要為大家介紹了Pytorch結(jié)合PyG實(shí)現(xiàn)MLP過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
基于Python OpenCV實(shí)現(xiàn)圖像的覆蓋
本文將基于Python、OpenCV和Numpy實(shí)現(xiàn)圖像的覆蓋,即小圖像覆蓋在大圖像上。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-02-02
BeautifulSoup中find和find_all的使用詳解
這篇文章主要介紹了BeautifulSoup中find和find_all的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

