網站首頁 編程語言 正文
Selenium 是一個自動化測試工具,利用它可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作,同時還可以獲取瀏覽器當前呈現的頁面的源代碼,做到可見即可獲取。對于一些 JavaScript 動態渲染的頁面來說,此種抓取方式非常有效。接下來,就讓我們來感受一下它的強大之處吧。 ?
??webdriver的安裝?
??selenium安裝
?首先,我們使用selenium進行測試,所以我們得安裝selenium庫。
pip install selenium
???驅動安裝
webdriver 是瀏覽器對應的驅動,我們使用的的瀏覽器有三種谷歌Chrome、微軟Microsoft Edge、還有一個火狐Firefox,但是我們經常使用谷歌Chrome瀏覽器進行測試。現在我們就以Chrome瀏覽器為例下載它對應的chromedriver?。
?官網:http://chromedriver.storage.googleapis.com/index.html
注意:
我們下載chromedriver 驅動時,我們要查明瀏覽器的版本,要對應相應的版本號進行下載,否則會報錯。禁止Google瀏覽器更新服務,可以上網查教程。
??基本使用?
??查找節點?
Selenium 可以驅動瀏覽器完成各種操作,比如填充表單、模擬點擊等。比如,我們想要完成向某個輸入框輸入文字的操作,總需要知道這個輸入框在哪里吧?而 Selenium 提供了一系列查找節點的方法,我們可以用這些方法來獲取想要的節點,以便下一步執行一些動作或者提取信息。 ?
獲取節點的方法:
find_element_by_id
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?
?給個示例
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('Python')
browser.find_element_by_id('su').click()
# 提取頁面
print(browser.page_source.encode('utf-8'))
# 提取cookie
print(browser.get_cookies())
# 提取當前請求地址
print(browser.current_url)
browser.close()
運行代碼后發現,會自動彈出一個 Chrome 瀏覽器。瀏覽器首先會跳轉到百度,然后在搜索框中輸入 Python,接著跳轉到搜索結果頁 ?
注:當我們的chromedriver驅動沒有放置到Chrome瀏覽器路徑時,我們可以使用以下來申明瀏覽器對象。
browser = webdriver.Chrome(executable_path="chromedriver安裝路徑")
方法總結:
- brower.get(url):跳轉當前url鏈接。
- browser.find_element_by_id('id屬性值'):定位到id屬性值。
- send_keys('輸入關鍵字'):定位到輸入框后輸入。
- find_element_by_id('id屬性值').click():定位到id屬性值后點擊。
- browser.page_source.encode('utf-8'):獲取當前頁面的源碼。
- browser.get_cookies():提取cookies。
- browser.current_url:獲取當前頁面的url。
- brower.close():關閉瀏覽器。
??執行 JavaScript
對于某些操作,Selenium API 并沒有提供。比如,下拉進度條,它可以直接模擬運行 JavaScript,此時使用 execute_script() 方法即可實現,代碼如下:
# document.body.scrollHeight 獲取頁面高度
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://36kr.com/')
# 下拉邊框 一次性下拉
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
# 慢慢的下拉
for i in range(1,9):
time.sleep(random.randint(100, 300) / 1000)
browser.execute_script('window.scrollTo(0,{})'.format(i * 700))
這里就利用 execute_script() 方法將進度條下拉到最底部。為了模擬人為活動,我們調節了下拉的緩沖時間。
我們使用瀏覽器的控制臺輸入以下代碼也能運行。
window.scrollTo(0, document.body.scrollHeight)
圖例:
??切換 Frame
我們知道網頁中有一種節點叫作 iframe,也就是子 Frame,相當于頁面的子頁面,它的結構和外部網頁的結構完全一致。Selenium 打開頁面后,它默認是在父級 Frame 里面操作,而此時如果頁面中還有子 Frame,它是不能獲取到子 Frame 里面的節點的。這時就需要使用 switch_to.frame() 方法來切換 Frame。示例如下: ?
browser.get('https://www.douban.com/')
login_iframe = browser.find_element_by_xpath('//div[@class="login"]/iframe')
browser.switch_to.frame(login_iframe)
browser.find_element_by_class_name('account-tab-account').click()
browser.find_element_by_id('username').send_keys('123123123')
首先我們要定位到iframe,然后用switch_to.frame() 方法來切換 Frame,這時我們就可以定位到子 Frame進行有關操作了。
??前進后退
平常使用瀏覽器時都有前進和后退功能,Selenium 也可以完成這個操作,它使用 back() 方法后退,使用 forward() 方法前進。示例如下:?
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
這里我們連續訪問 3 個頁面,然后調用 back() 方法回到第二個頁面,接下來再調用 forward() 方法又可以前進到第三個頁面。 ?
??選項卡管理
在訪問網頁的時候,會開啟一個個選項卡。在 Selenium 中,我們也可以對選項卡進行操作。示例如下:
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('https://python.org')
這里我們先跳轉到百度再打開一個空白選項卡打印選項卡編號,再跳轉到第二個選項卡也就是這個空白選項卡打開淘寶,休息一秒,再跳轉到第一個選項卡打開python官網。
??配置操作
?selenium有很多配置,下面我舉幾個常見的。
options = webdriver.ChromeOptions()
# 無頭模式
option.add_argument("-headless")
#設置代理
options.add_argument('proxy-server=' +'192.168.0.28:808')
#將瀏覽器最大化顯示
browser.maximize_window()
# 設置寬高
browser.set_window_size(480, 800)
# 通過js新打開一個窗口
driver.execute_script('window.open("https://www.baidu.com");')
browser = webdriver.Chrome(chrome_options=options)
?繞過檢測
繞過檢測對于一些網站的自動化反爬很管用。?
# 設置屏蔽
options = webdriver.ChromeOptions()
options.add_argument('--disable-blink-features=AutomationControlled')
browsers = webdriver.Chrome(chrome_options=options)
browsers.get('https://bot.sannysoft.com/')
這里我們使用下面這個網站進行自動化檢測
網站:https://bot.sannysoft.com/
我們沒設置繞過檢測
我們設置了繞過檢測后
原文鏈接:https://blog.csdn.net/weixin_54667422/article/details/125576093
相關推薦
- 2022-12-27 React生命周期函數圖解介紹_React
- 2022-12-08 React源碼state計算流程和優先級實例解析_React
- 2023-07-10 MyBatis中的#{}和${}有什么區別?
- 2022-07-04 PyTorch搭建LSTM實現多變量時序負荷預測_python
- 2022-08-10 Python實現以主程序的形式執行模塊_python
- 2022-06-15 GO語言類型查詢類型斷言示例解析_Golang
- 2022-04-12 pandas讀取csv格式數據時header參數設置方法_python
- 2022-01-06 Spring Aware接口詳解
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支