Python使用Selenium實(shí)現(xiàn)模擬登錄的示例代碼
1.引入Selenium
Selenium(本文基于python3.8)是一個(gè)功能強(qiáng)大的自動(dòng)化測(cè)試工具,它可以用于模擬用戶在瀏覽器中的行為,比如點(diǎn)擊、輸入、滾動(dòng)等等,也可用于模擬登錄網(wǎng)站并進(jìn)行爬蟲操作。本教程將詳細(xì)介紹如何使用Python編寫一個(gè)模擬登錄地爬蟲,使用XPath等多種元素匹配方法。
在開始之前,需要先安裝Selenium庫。你可以使用以下命令來安裝:
pip install selenium
2.啟動(dòng)瀏覽器
接下來,我們需要下載并安裝Chrome瀏覽器(你也可以使用其它瀏覽器)以及對(duì)應(yīng)的ChromeDriver。你可以在Chrome官方網(wǎng)站上下載最新的Chrome瀏覽器,并確保下載與你的Chrome瀏覽器版本相匹配的ChromeDriver。安裝完成后,將ChromeDriver的路徑添加到系統(tǒng)環(huán)境變量中。
首先,我們需要導(dǎo)入所需的庫:
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
接下來,我們需要?jiǎng)?chuàng)建一個(gè)WebDriver對(duì)象,這將啟動(dòng)Chrome瀏覽器:
driver = webdriver.Chrome()
3.模擬登錄網(wǎng)站
現(xiàn)在,我們可以使用WebDriver對(duì)象打開我們要模擬登錄的網(wǎng)站:
driver.get("https://example.com")
接下來,我們需要找到登錄表單的元素,并輸入用戶名和密碼。我們可以使用Chrome瀏覽器的開發(fā)者工具來查找這些元素的XPath路徑。
例如,如果我們要找到用戶名輸入框的XPath路徑,我們可以使用以下代碼:
username_input = driver.find_element(By.XPATH, "http://input[@name='username']")
然后,我們可以使用以下代碼將用戶名輸入到輸入框中:
username_input.send_keys("your_username")
同樣的方式,我們可以找到密碼輸入框的XPath路徑,并輸入密碼:
password_input = driver.find_element(By.XPATH, "http://input[@name='password']") password_input.send_keys("your_password")
現(xiàn)在,我們可以找到登錄按鈕的XPath路徑,并點(diǎn)擊它:
login_button = driver.find_element(By.XPATH, "http://button[@type='submit']") login_button.click()
在點(diǎn)擊登錄按鈕后,網(wǎng)站將進(jìn)行登錄驗(yàn)證。為了確保登錄成功,我們可以使用WebDriverWait來等待特定元素加載完成。例如,我們可以等待頁面上的用戶信息元素加載完成:
user_info = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "http://div[@class='user-info']")) )
現(xiàn)在,我們已經(jīng)成功模擬登錄并等待特定元素加載完成。我們可以使用WebDriver對(duì)象進(jìn)行進(jìn)一步的爬蟲操作,例如抓取頁面上的數(shù)據(jù)或點(diǎn)擊其他鏈接。
最后,我們需要關(guān)閉WebDriver對(duì)象,以確保瀏覽器窗口被正確關(guān)閉:
driver.quit()
4.Selenium實(shí)戰(zhàn)某寶
本來想利用selenium實(shí)現(xiàn)模擬登錄國內(nèi)某購物網(wǎng)站,結(jié)果某寶實(shí)在有點(diǎn)強(qiáng),最終還是沒能登錄成功?!菊f明淘寶夠安全啊】
當(dāng)然網(wǎng)上也查了點(diǎn)資料,有說用fiddler抓包工具將登錄頁js替換的,這樣淘寶登錄的滑塊便不會(huì)出現(xiàn),不確定此類方法是否有效,但操作復(fù)雜度,肯定是嘎嘎高的。 還有一種方式就是通過微博登錄,綁定淘寶。這種似乎可行。
在本示例中,僅在代碼實(shí)現(xiàn)上,盡可能避免大型網(wǎng)站的對(duì)爬蟲的檢測(cè)。具體請(qǐng)看代碼注釋:
import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver import ActionChains # 登錄網(wǎng)站 login_url = f'https://login.taobao.com/member/login.jhtml' login_username = 'xxxxxxxxxxxx' login_password = 'xxxxxxxxxxxxxxxxxx' # 防止打開瀏覽器后閃退 options = webdriver.ChromeOptions() options.add_experimental_option('detach', True) #options.add_argument('--headless') # 無頭模式 # 設(shè)置為開發(fā)者模式,防止被各大網(wǎng)站識(shí)別出來使用了Selenium options.add_experimental_option('excludeSwitches', ['enable-automation']) browser = webdriver.Chrome(options=options) browser.get(login_url) # 設(shè)置window.navigator.webdriver,希望能繞過滑塊驗(yàn)證 browser.execute_script('Object.defineProperties(navigator,{webdriver:{get:()=>false}})') # 查找用戶名和密碼輸入框所在元素 username_input = browser.find_element(By.ID, 'fm-login-id') username_input.click() username_input.send_keys(login_username) # 等待 time.sleep(2) password_input = browser.find_element(By.XPATH, "http://input[@name='fm-login-password']") password_input.click() password_input.send_keys(login_password) time.sleep(2) # 滑塊處理 browser.switch_to.frame('baxia-dialog-content') slider = browser.find_element(by=By.XPATH, value='//*[@id="nc_1_n1z"]') slider_block = browser.find_element(by=By.XPATH, value='//*[@id="nc_1__scale_text"]') chains = ActionChains(browser) chains.drag_and_drop_by_offset(slider, slider_block.size['width'], -slider_block.size['height']) chains.perform() time.sleep(2) # 查找按鈕元素,模擬點(diǎn)擊 #點(diǎn)擊登錄按鈕 browser.find_element(By.XPATH, ".//*[@id='login-form']/div[4]/button").click() browser.implicitly_wait(10) # 關(guān)閉瀏覽器 browser.close() browser.quit()
在上述代碼中,我們通過webdriver.Chrome(options=options)
來創(chuàng)建一個(gè)瀏覽器窗口實(shí)例,并通過傳入options來控制瀏覽器的各個(gè)屬性,其中options.add_experimental_option('detach', True)
用于防止瀏覽器在執(zhí)行完后閃退。options.add_argument('--headless')
表明啟用了無頭模式。這樣做是為了在后臺(tái)運(yùn)行瀏覽器,而不需要顯示瀏覽器窗口。隨后我們使用了find_element
來定位元素,并使用send_keys
方法輸入賬戶名及密碼。
在Selenium中,可以使用各種方法來定位網(wǎng)頁上的元素。舊版本selenium 中,使用的是find_element_by_xpath
, find_element_by_id
, find_element_by_name
等,在新版中已經(jīng)修改為 find_element(By.ID, 'id')
等,通過傳入By參數(shù)查找。用的比較多的還是XPath,下表列出了部分XPath最有用的路徑表達(dá)式:
表達(dá)式 | 描述 |
---|---|
nodename | 選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn) |
/ | 從根節(jié)點(diǎn)選取 |
// | 從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn),而不考慮它們的位置 |
. | 選取當(dāng)前節(jié)點(diǎn) |
.. | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) |
@ | 選取屬性 |
OOPS:獲取XPath有個(gè)最簡單的方式,就是打開瀏覽器審查元素,選中元素,右鍵Copy,你,學(xué)廢了嗎?:smile::smile::smile:
有些網(wǎng)站的元素并不能直接通過find尋找到,比如有些網(wǎng)站頁面用了大量的frame或iframe,那么此時(shí)需要先進(jìn)入到該元素所在的frame,然后才能找到需要的元素:browser.switch_to.frame('baxia-dialog-content')
有時(shí)候?yàn)g覽器的加載速度跟不上你代碼的運(yùn)行速度,或者請(qǐng)求速度比較慢,可以使用暫停的方法來進(jìn)行緩沖
time.sleep(2) browse.implicitly_wait(10)
browser.implicitly_wait(10)
,隱性等待設(shè)置了一個(gè)時(shí)間,在一段時(shí)間內(nèi)網(wǎng)頁是否加載完成,如果完成了,就進(jìn)行下一步;在設(shè)置的時(shí)間內(nèi)沒有加載完成,則會(huì)報(bào)超時(shí)加載。
time.sleep(2)
一般用于模擬人為操作,防止因?yàn)辄c(diǎn)擊過快,而觸發(fā)網(wǎng)站反爬機(jī)制。
5.Cookies模擬登錄
Cookies是存儲(chǔ)在用戶計(jì)算機(jī)上的小型文本文件,用于跟蹤和存儲(chǔ)用戶在網(wǎng)站上的活動(dòng)信息。當(dāng)用戶登錄網(wǎng)站時(shí),網(wǎng)站會(huì)將一個(gè)唯一的標(biāo)識(shí)符存儲(chǔ)在Cookies中,以便在用戶的后續(xù)訪問中識(shí)別用戶身份。
此時(shí),瀏覽器將會(huì)模擬點(diǎn)擊登錄按鈕并提交您的登錄憑據(jù)。如果您的憑據(jù)是正確的,您將被成功登錄到網(wǎng)站。
有時(shí)候,網(wǎng)站會(huì)要求保持登錄狀態(tài),以便在后續(xù)訪問中保持身份識(shí)別。為了實(shí)現(xiàn)這一點(diǎn),我們可以使用以下代碼來獲取當(dāng)前瀏覽器的Cookies:
# 獲取當(dāng)前瀏覽器的Cookies cookies = driver.get_cookies()
這樣就可以將這些Cookies保存下來,并在以后的訪問中使用它們來保持登錄狀態(tài)。但如果沒有登錄成功,那用Cookies登錄也是一場空談!
6.總結(jié)
總結(jié)一下,使用Selenium模擬登錄是一種強(qiáng)大而靈活的方式,可以幫助開發(fā)人員實(shí)現(xiàn)各種登錄功能。通過使用瀏覽器驅(qū)動(dòng)程序,訪問登錄頁面,輸入憑據(jù)并模擬點(diǎn)擊登錄按鈕,我們可以輕松地模擬用戶的登錄行為。通過XPath等多種元素匹配方法,我們可以輕松地定位并操作網(wǎng)頁上的元素。此外,還可以通過獲取和保存Cookies保持登錄狀態(tài),以便在后續(xù)的訪問中保持身份識(shí)別。
以上就是Python使用Selenium實(shí)現(xiàn)模擬登錄的詳細(xì)內(nèi)容,更多關(guān)于Python Selenium模擬登錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
關(guān)于Python使用logging庫進(jìn)行有效日志管理的方法詳解
在開發(fā)大型軟件或處理復(fù)雜問題時(shí),我們經(jīng)常需要一種方法來記錄和跟蹤程序的運(yùn)行狀態(tài),Python 提供了一個(gè)名為 logging 的標(biāo)準(zhǔn)庫,可以幫助我們更好地完成這項(xiàng)任務(wù),在這篇文章中,我們將介紹如何使用 Python 的 logging 庫進(jìn)行日志記錄2023-06-06使用Python實(shí)現(xiàn)簡單的人臉識(shí)別功能(附源碼)
Python中實(shí)現(xiàn)人臉識(shí)別功能有多種方法,依賴于python膠水語言的特性,我們通過調(diào)用包可以快速準(zhǔn)確的達(dá)成這一目的,本文給大家分享使用Python實(shí)現(xiàn)簡單的人臉識(shí)別功能的操作步驟,感興趣的朋友一起看看吧2021-12-12Python統(tǒng)計(jì)字符串中英文字母、空格、數(shù)字和其它字符的個(gè)數(shù)
這篇文章主要給大家介紹了關(guān)于Python統(tǒng)計(jì)字符串中英文字母、空格、數(shù)字和其它字符的個(gè)數(shù)的相關(guān)資料,本文實(shí)例講述了python統(tǒng)計(jì)字符串中指定字符出現(xiàn)次數(shù)的方法,需要的朋友可以參考下2023-06-06基于python內(nèi)置函數(shù)與匿名函數(shù)詳解
下面小編就為大家分享一篇基于python內(nèi)置函數(shù)與匿名函數(shù)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01符合語言習(xí)慣的 Python 優(yōu)雅編程技巧【推薦】
Python最大的優(yōu)點(diǎn)之一就是語法簡潔,好的代碼就像偽代碼一樣,干凈、整潔、一目了然。這篇文章給大家介紹Python 優(yōu)雅編程技巧,感興趣的朋友跟隨小編一起看看吧2018-09-09通過python-turtle庫實(shí)現(xiàn)繪制圖畫
turtle庫是python的基礎(chǔ)繪圖庫,經(jīng)常被用來給孩子們介紹編程知識(shí)的方法庫,是標(biāo)準(zhǔn)庫之一,利用turtle可以制作很多復(fù)雜的繪圖。本文將為大家介紹通過turtle庫繪制的一些有趣的圖畫,感興趣的小伙伴可以學(xué)習(xí)一下2021-12-12Django Rest Framework框架構(gòu)建復(fù)雜API技能詳解
這篇文章會(huì)詳細(xì)介紹Django REST Framework的核心組成部分,包括Serializers、ViewSets、Routers、權(quán)限和認(rèn)證系統(tǒng)以及測(cè)試和調(diào)試工具,文章從基礎(chǔ)開始,逐步深入,旨在幫助讀者掌握使用Django REST Framework構(gòu)建復(fù)雜API的技能2023-09-09