Python使用Selenium實(shí)現(xiàn)模擬登錄的示例代碼
1.引入Selenium
Selenium(本文基于python3.8)是一個(gè)功能強(qiáng)大的自動(dòng)化測(cè)試工具,它可以用于模擬用戶(hù)在瀏覽器中的行為,比如點(diǎn)擊、輸入、滾動(dòng)等等,也可用于模擬登錄網(wǎng)站并進(jìn)行爬蟲(chóng)操作。本教程將詳細(xì)介紹如何使用Python編寫(xiě)一個(gè)模擬登錄地爬蟲(chóng),使用XPath等多種元素匹配方法。
在開(kāi)始之前,需要先安裝Selenium庫(kù)。你可以使用以下命令來(lái)安裝:
pip install selenium
2.啟動(dòng)瀏覽器
接下來(lái),我們需要下載并安裝Chrome瀏覽器(你也可以使用其它瀏覽器)以及對(duì)應(yīng)的ChromeDriver。你可以在Chrome官方網(wǎng)站上下載最新的Chrome瀏覽器,并確保下載與你的Chrome瀏覽器版本相匹配的ChromeDriver。安裝完成后,將ChromeDriver的路徑添加到系統(tǒng)環(huán)境變量中。
首先,我們需要導(dǎo)入所需的庫(kù):
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
接下來(lái),我們需要?jiǎng)?chuàng)建一個(gè)WebDriver對(duì)象,這將啟動(dòng)Chrome瀏覽器:
driver = webdriver.Chrome()
3.模擬登錄網(wǎng)站
現(xiàn)在,我們可以使用WebDriver對(duì)象打開(kāi)我們要模擬登錄的網(wǎng)站:
driver.get("https://example.com")接下來(lái),我們需要找到登錄表單的元素,并輸入用戶(hù)名和密碼。我們可以使用Chrome瀏覽器的開(kāi)發(fā)者工具來(lái)查找這些元素的XPath路徑。
例如,如果我們要找到用戶(hù)名輸入框的XPath路徑,我們可以使用以下代碼:
username_input = driver.find_element(By.XPATH, "http://input[@name='username']")
然后,我們可以使用以下代碼將用戶(hù)名輸入到輸入框中:
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來(lái)等待特定元素加載完成。例如,我們可以等待頁(yè)面上的用戶(hù)信息元素加載完成:
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)一步的爬蟲(chóng)操作,例如抓取頁(yè)面上的數(shù)據(jù)或點(diǎn)擊其他鏈接。
最后,我們需要關(guān)閉WebDriver對(duì)象,以確保瀏覽器窗口被正確關(guān)閉:
driver.quit()
4.Selenium實(shí)戰(zhàn)某寶
本來(lái)想利用selenium實(shí)現(xiàn)模擬登錄國(guó)內(nèi)某購(gòu)物網(wǎng)站,結(jié)果某寶實(shí)在有點(diǎn)強(qiáng),最終還是沒(méi)能登錄成功?!菊f(shuō)明淘寶夠安全啊】
當(dāng)然網(wǎng)上也查了點(diǎn)資料,有說(shuō)用fiddler抓包工具將登錄頁(yè)js替換的,這樣淘寶登錄的滑塊便不會(huì)出現(xiàn),不確定此類(lèi)方法是否有效,但操作復(fù)雜度,肯定是嘎嘎高的。 還有一種方式就是通過(guò)微博登錄,綁定淘寶。這種似乎可行。
在本示例中,僅在代碼實(shí)現(xiàn)上,盡可能避免大型網(wǎng)站的對(duì)爬蟲(chóng)的檢測(cè)。具體請(qǐng)看代碼注釋?zhuān)?/p>

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'
# 防止打開(kāi)瀏覽器后閃退
options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)
#options.add_argument('--headless') # 無(wú)頭模式
# 設(shè)置為開(kāi)發(fā)者模式,防止被各大網(wǎng)站識(shí)別出來(lái)使用了Selenium
options.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(options=options)
browser.get(login_url)
# 設(shè)置window.navigator.webdriver,希望能繞過(guò)滑塊驗(yàn)證
browser.execute_script('Object.defineProperties(navigator,{webdriver:{get:()=>false}})')
# 查找用戶(hù)名和密碼輸入框所在元素
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()在上述代碼中,我們通過(guò)webdriver.Chrome(options=options) 來(lái)創(chuàng)建一個(gè)瀏覽器窗口實(shí)例,并通過(guò)傳入options來(lái)控制瀏覽器的各個(gè)屬性,其中options.add_experimental_option('detach', True)用于防止瀏覽器在執(zhí)行完后閃退。options.add_argument('--headless') 表明啟用了無(wú)頭模式。這樣做是為了在后臺(tái)運(yùn)行瀏覽器,而不需要顯示瀏覽器窗口。隨后我們使用了find_element來(lái)定位元素,并使用send_keys方法輸入賬戶(hù)名及密碼。
在Selenium中,可以使用各種方法來(lái)定位網(wǎng)頁(yè)上的元素。舊版本selenium 中,使用的是find_element_by_xpath, find_element_by_id, find_element_by_name等,在新版中已經(jīng)修改為 find_element(By.ID, 'id')等,通過(guò)傳入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è)最簡(jiǎn)單的方式,就是打開(kāi)瀏覽器審查元素,選中元素,右鍵Copy,你,學(xué)廢了嗎?:smile::smile::smile:

有些網(wǎng)站的元素并不能直接通過(guò)find尋找到,比如有些網(wǎng)站頁(yè)面用了大量的frame或iframe,那么此時(shí)需要先進(jìn)入到該元素所在的frame,然后才能找到需要的元素:browser.switch_to.frame('baxia-dialog-content')
有時(shí)候?yàn)g覽器的加載速度跟不上你代碼的運(yùn)行速度,或者請(qǐng)求速度比較慢,可以使用暫停的方法來(lái)進(jìn)行緩沖
time.sleep(2) browse.implicitly_wait(10)
browser.implicitly_wait(10),隱性等待設(shè)置了一個(gè)時(shí)間,在一段時(shí)間內(nèi)網(wǎng)頁(yè)是否加載完成,如果完成了,就進(jìn)行下一步;在設(shè)置的時(shí)間內(nèi)沒(méi)有加載完成,則會(huì)報(bào)超時(shí)加載。
time.sleep(2)一般用于模擬人為操作,防止因?yàn)辄c(diǎn)擊過(guò)快,而觸發(fā)網(wǎng)站反爬機(jī)制。
5.Cookies模擬登錄
Cookies是存儲(chǔ)在用戶(hù)計(jì)算機(jī)上的小型文本文件,用于跟蹤和存儲(chǔ)用戶(hù)在網(wǎng)站上的活動(dòng)信息。當(dāng)用戶(hù)登錄網(wǎng)站時(shí),網(wǎng)站會(huì)將一個(gè)唯一的標(biāo)識(shí)符存儲(chǔ)在Cookies中,以便在用戶(hù)的后續(xù)訪(fǎng)問(wèn)中識(shí)別用戶(hù)身份。
此時(shí),瀏覽器將會(huì)模擬點(diǎn)擊登錄按鈕并提交您的登錄憑據(jù)。如果您的憑據(jù)是正確的,您將被成功登錄到網(wǎng)站。
有時(shí)候,網(wǎng)站會(huì)要求保持登錄狀態(tài),以便在后續(xù)訪(fǎng)問(wèn)中保持身份識(shí)別。為了實(shí)現(xiàn)這一點(diǎn),我們可以使用以下代碼來(lái)獲取當(dāng)前瀏覽器的Cookies:
# 獲取當(dāng)前瀏覽器的Cookies cookies = driver.get_cookies()
這樣就可以將這些Cookies保存下來(lái),并在以后的訪(fǎng)問(wèn)中使用它們來(lái)保持登錄狀態(tài)。但如果沒(méi)有登錄成功,那用Cookies登錄也是一場(chǎng)空談!
6.總結(jié)
總結(jié)一下,使用Selenium模擬登錄是一種強(qiáng)大而靈活的方式,可以幫助開(kāi)發(fā)人員實(shí)現(xiàn)各種登錄功能。通過(guò)使用瀏覽器驅(qū)動(dòng)程序,訪(fǎng)問(wèn)登錄頁(yè)面,輸入憑據(jù)并模擬點(diǎn)擊登錄按鈕,我們可以輕松地模擬用戶(hù)的登錄行為。通過(guò)XPath等多種元素匹配方法,我們可以輕松地定位并操作網(wǎng)頁(yè)上的元素。此外,還可以通過(guò)獲取和保存Cookies保持登錄狀態(tài),以便在后續(xù)的訪(fǎng)問(wèn)中保持身份識(shí)別。
以上就是Python使用Selenium實(shí)現(xiàn)模擬登錄的詳細(xì)內(nèi)容,更多關(guān)于Python Selenium模擬登錄的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
10個(gè)提升Python模型訓(xùn)練效率的高級(jí)腳本
在機(jī)器學(xué)習(xí)領(lǐng)域,隨著數(shù)據(jù)集規(guī)模的不斷擴(kuò)大和模型復(fù)雜度的增加,訓(xùn)練時(shí)間變得越來(lái)越長(zhǎng),本文將介紹10個(gè)高級(jí)Python多線(xiàn)程腳本,希望對(duì)大家有所幫助2025-07-07
Python OpenCV實(shí)現(xiàn)視頻追蹤
這篇文章主要為大家詳細(xì)介紹了Python OpenCV實(shí)現(xiàn)視頻追蹤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Python getopt模塊處理命令行選項(xiàng)實(shí)例
這篇文章主要介紹了Python getopt模塊處理命令行選項(xiàng)實(shí)例,本文講解相對(duì)簡(jiǎn)單,需要的朋友可以參考下2014-05-05
python中將數(shù)據(jù)生成為Excel文件的5種方法舉例
工作中需要把數(shù)據(jù)導(dǎo)入到excel中,記錄一下操作方式,這篇文章主要給大家介紹了關(guān)于python中將數(shù)據(jù)生成為Excel文件的5種方法,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
深入理解Python中的函數(shù)參數(shù)傳遞機(jī)制
在Python中,對(duì)于函數(shù)的參數(shù)傳遞,有兩種主要的方式:傳值和傳引用。事實(shí)上,Python的參數(shù)傳遞是一種“傳對(duì)象引用”的方式,本文呢我們將詳細(xì)介紹Python的函數(shù)參數(shù)傳遞機(jī)制,這對(duì)理解Python編程語(yǔ)言的底層實(shí)現(xiàn)以及優(yōu)化你的代碼都非常有幫助2023-07-07
Python使用Paramiko實(shí)現(xiàn)輕松判斷文件類(lèi)型
Paramiko是一個(gè)用于SSHv2協(xié)議的Python實(shí)現(xiàn),提供了客戶(hù)端和服務(wù)器功能,下面我們就來(lái)看看如何使用Paramiko判斷文件類(lèi)型,并提取文件的上級(jí)目錄吧2025-03-03
Python通過(guò)跳板機(jī)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的方法
跳板機(jī)是一類(lèi)可作為跳板批量操作的遠(yuǎn)程設(shè)備的網(wǎng)絡(luò)設(shè)備,是系統(tǒng)管理員和運(yùn)維人員常用的操作平臺(tái)之一。本文給大家介紹Python通過(guò)跳板機(jī)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的方法,感興趣的朋友跟隨小編一起看看吧2021-10-10

