最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用selenium模擬登錄解決滑塊驗證問題的實現(xiàn)

 更新時間:2019年05月10日 14:22:26   作者:鍋爐房劉大爺  
這篇文章主要介紹了使用selenium模擬登錄解決滑塊驗證問題的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本次主要是使用selenium模擬登錄網(wǎng)頁端的TX新聞,本來最開始是模擬請求的,但是某一天突然發(fā)現(xiàn),部分賬號需要經(jīng)過滑塊驗證才能正常登錄,如果還是模擬請求,需要的參數(shù)太多了,找的心累。不過好在TX的滑塊驗證是他們自己開發(fā)的,沒有極驗?zāi)敲磸?fù)雜,當(dāng)然相反的,想要模擬就得自己去一點點探索了,畢竟對極驗滑塊的破解,網(wǎng)上已經(jīng)可以找到現(xiàn)成的代碼來用了。下面說一下模擬的實現(xiàn)過程和我遇見的問題。

1.登錄入口

我是通過點擊打開鏈接來當(dāng)做登錄入口的

部分代碼實現(xiàn):

driver = webdriver.Chrome()
driver.get(url)

2.點擊“賬號密碼登錄”

selenium可以實現(xiàn)對網(wǎng)頁元素的定位,我這里是通過id屬性來定位“帳號密碼登錄”按鈕的。這里需要注意的是,有時候可能會因為網(wǎng)絡(luò)不好等問題導(dǎo)致加載登錄入口頁會很慢,所以在點擊“帳號密碼登錄”按鈕前,需要做一個判斷:判斷代表“帳號密碼登錄”的HTML元素是否已經(jīng)加載完成。

“賬號密碼登錄”按鈕的id屬性截圖:


部分代碼實現(xiàn):

element = WebDriverWait(driver, 5, 0.5).until(
		EC.presence_of_element_located((By.ID, "switcher_plogin"))
	) # from selenium.webdriver.common.by import By
element.click()

3.輸入賬號、密碼并點擊登錄

這一步比較簡單,直接上代碼:

driver.find_element_by_id('u').send_keys('123456') # 輸入用戶名
driver.find_element_by_id('p').send_keys('ccccc')  # 輸入密碼
driver.find_element_by_id('login_button').click()  # 點擊登錄

4.滑塊驗證過程

1)簡要說明

因為主要目的就是為了模擬滑塊驗證,所以在輸入用戶名和密碼的時候直接選擇輸入“123456”和“ccccc”,這樣就必然會跳到滑塊驗證的頁面:


接下來的問題就是如何模擬滑動的過程。這里首先要說一下,經(jīng)過多次測試發(fā)現(xiàn),TX的滑塊驗證每次需要拖動的距離是有一定范圍的,“缺口”部分的位置基本上都在靠右側(cè)的一面,不像極驗的滑塊驗證,“缺口”部分可能出現(xiàn)在任意的位置,這樣在實現(xiàn)“滑動”過程前,就必須判斷每次滑動的距離是多少。所以,對于TX的滑塊驗證,只要設(shè)置一個大概的距離“模擬滑動”即可,失敗的時候可以通過增減移動距離進(jìn)行重試,后面會進(jìn)一步說明。

2)為什么找不到“藍(lán)色滑塊”

前面已經(jīng)點擊了“登錄”并跳轉(zhuǎn)到“安全驗證”的頁面,接著就是去模擬“拖動”截圖中的“藍(lán)色滑塊”,所以首先要告訴driver,代表“藍(lán)色滑塊”的html元素是什么。代表“藍(lán)色滑塊”的html元素截圖:


通過上面的截圖可以知道,id值為"tcaptcha_drag_button"的div標(biāo)簽代表的就是“藍(lán)色滑塊”,所以最開始我是直接嘗試去拖動它,但是這時候發(fā)現(xiàn)報錯了,部分截圖如下:


報錯的原因很明顯,在當(dāng)前得到的所有html元素中,找不到id值為"tcaptcha_drag_button"的div標(biāo)簽。這是為什么?

3)切換frame

為什么出現(xiàn)上面的問題?通過查找相關(guān)的資料才知道,在跳轉(zhuǎn)到“安全驗證”的頁面的時候,“進(jìn)入”了一個新的frame,可以理解為,在“登錄頁面”嵌套了一個“驗證頁面”,而當(dāng)前的driver加載的html元素全部都是“登錄頁面”的,想要找到并拖動“藍(lán)色滑塊”,就要先切換到“驗證頁面”,這里通過driver.switch_to方法實現(xiàn):

iframe = driver.find_element_by_xpath('//iframe') # 找到“嵌套”的iframe
driver.switch_to.frame(iframe)  # 切換到iframe

4)模擬拖動

切換到iframe之后,就可以通過driver.find_element_by_id('tcaptcha_drag_button')找到“藍(lán)色滑塊”并拖動它了。拖動操作會用到selenium.webdriver的ActionChains類,部分代碼如下:

button = driver.find_element_by_id('tcaptcha_drag_button')    # 找到“藍(lán)色滑塊”
action = ActionChains(driver)            # 實例化一個action對象
action.click_and_hold(button).perform()  # perform()用來執(zhí)行ActionChains中存儲的行為
action.reset_actions()
action.move_by_offset(180, 0).perform()  # 移動滑塊

5)構(gòu)造移動軌跡

為了使拖動過程模擬的更“真實”,可以構(gòu)造一個滑動軌跡,我這里也是參考了別人的代碼看這里,簡單實現(xiàn)了一下,實際上TX新聞的滑塊驗證對這方面好像要求不是很嚴(yán)格:

def get_track(distance):
	track = []
	current = 0
	mid = distance * 3 / 4
	t = 0.2
	v = 0
	while current < distance:
		if current < mid:
			a = 2
		else:
			a = -3
		v0 = v
		v = v0 + a * t
		move = v0 * t + 1 / 2 * a * t * t
		current += move
		track.append(round(move))
	return track

6)如何確定已經(jīng)“驗證成功”了

接下來的問題就是,我如何告訴程序,已經(jīng)“驗證成功”了呢?經(jīng)過測試發(fā)現(xiàn),當(dāng)拖動滑塊完成拼圖“驗證成功”后,網(wǎng)頁又從“安全驗證”的頁面又跳回了“登錄頁面”,滑動前截圖:

滑動驗證成功的截圖:

成功后跳轉(zhuǎn)回“登錄”頁面:

通過上面的截圖我們可以知道,在“驗證通過”之前,在“安全驗證”頁面我們一直可以看到“拖動下方滑塊完成拼圖”的文字提示,也就是說,如果驗證沒有通過,那么在當(dāng)前的所有html元素中,我們是可以找到文本為“拖動下方滑塊完成拼圖”的標(biāo)簽的:

通過截圖可以知道,該標(biāo)簽的class為"tcaptcha-title",通過driver.find_element_by_class_name('tcaptcha-title').text來判斷驗證是否成功。

7)重試

前面說了,我們可以通過提前設(shè)置一個“可能的”值當(dāng)初始距離來移動滑塊,如果移動的距離“過長”,就減小該值當(dāng)做下次移動的距離,所以可以加一個while循環(huán)。以上過程實現(xiàn)的完整代碼如下:

# encoding=utf8
 
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
 
url = 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?&low_login=0&appid=636014201&target=self&border_radius=1&maskOpacity=40&s_url=http%3A//www.qq.com/qq2012/loginSuccess.htm'
 
def get_track(distance):
	track = []
	current = 0
	mid = distance * 3 / 4
	t = 0.2
	v = 0
	while current < distance:
		if current < mid:
			a = 2
		else:
			a = -3
		v0 = v
		v = v0 + a * t
		move = v0 * t + 1 / 2 * a * t * t
		current += move
		track.append(round(move))
	return track
 
def main():
	driver = webdriver.Chrome()
	driver.set_window_position(900, 10)
	driver.get(url)
	# 檢測id為"switcher_plogin"的元素是否加在DOM樹中,如果出現(xiàn)了才能正常向下執(zhí)行
	element = WebDriverWait(driver, 5, 0.5).until(
		EC.presence_of_element_located((By.ID, "switcher_plogin"))
	)
	element.click()
 
	sleep(1)
	# 輸入用戶名和密碼
	driver.find_element_by_id('u').clear()
	driver.find_element_by_id('u').send_keys('123456')
	driver.find_element_by_id('p').clear()
	driver.find_element_by_id('p').send_keys('ccccc')
	sleep(1)
	# 點擊登錄
	driver.find_element_by_id('login_button').click()
 
	sleep(5)
 
	# 切換iframe
	try:
		iframe = driver.find_element_by_xpath('//iframe')
	except Exception as e:
		print 'get iframe failed: ', e
	sleep(2)	# 等待資源加載
	driver.switch_to.frame(iframe)
 
	# 等待圖片加載出來
	WebDriverWait(driver, 5, 0.5).until(
		EC.presence_of_element_located((By.ID, "tcaptcha_drag_button"))
	)
	try:
		button = driver.find_element_by_id('tcaptcha_drag_button')
	except Exception as e:
		print 'get button failed: ', e
 
	sleep(1)
	# 開始拖動 perform()用來執(zhí)行ActionChains中存儲的行為
	flag = 0
	distance = 195
	offset = 5
	times = 0
	while 1:
		action = ActionChains(driver)
		action.click_and_hold(button).perform()
		action.reset_actions()	# 清除之前的action
		print distance
		track = get_track(distance)
		for i in track:
			action.move_by_offset(xoffset=i, yoffset=0).perform()
			action.reset_actions()
		sleep(0.5)
		action.release().perform()
		sleep(5)
 
		# 判斷某元素是否被加載到DOM樹里,并不代表該元素一定可見
		try:
			alert = driver.find_element_by_class_name('tcaptcha-title').text
		except Exception as e:
			print 'get alert error: %s' % e
			alert = ''
		if alert:
			print u'滑塊位移需要調(diào)整: %s' % alert
			distance -= offset
			times += 1
			sleep(5)
		else:
			print '滑塊驗證通過'
			flag = 1
			driver.switch_to.parent_frame()    # 驗證成功后跳回最外層頁面
			break
 
	sleep(2)
	driver.quit()
	print "finish~~"
	return flag
 
if __name__ == '__main__':
	main()

5.小結(jié)

其實上面的代碼還可以進(jìn)一步“優(yōu)化”。例如,當(dāng)嘗試三次滑動后如果仍然沒有“驗證成功”,就應(yīng)該主動跳回“登錄”頁面,重新輸入賬號密碼登錄,進(jìn)入下一次驗證過程,而不是無休止的進(jìn)行“滑塊驗證”。除此之外,以上只是對“滑塊驗證”部分進(jìn)行了分析和模擬,實際情況是,通過了“滑塊驗證”后,有可能賬號或密碼錯誤了,這時候是不是應(yīng)該重新輸入賬號密碼進(jìn)入新一輪驗證過程呢?

所以,以上代碼還有待繼續(xù)完善,也歡迎看到這篇博文的人多多指正不足之處。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中的常用函數(shù)使用及說明

    Python中的常用函數(shù)使用及說明

    這篇文章主要介紹了Python中的常用函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • OpenCV-Python使用分水嶺算法實現(xiàn)圖像的分割與提取

    OpenCV-Python使用分水嶺算法實現(xiàn)圖像的分割與提取

    在圖像的處理過程中,經(jīng)常需要從圖像中將前景對象作為目標(biāo)圖像分割或者提取出來。本文就介紹了使用分水嶺算法實現(xiàn)圖像的分割與提取,感興趣的可以了解一下
    2021-06-06
  • django中嵌套的try-except實例

    django中嵌套的try-except實例

    這篇文章主要介紹了django中嵌套的try-except實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python dataframe如何選擇某一列非空的行

    python dataframe如何選擇某一列非空的行

    這篇文章主要介紹了python dataframe如何選擇某一列非空的行問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python中的exec()、eval()及complie()示例詳解

    python中的exec()、eval()及complie()示例詳解

    這篇文章主要介紹了python中的exec()、eval()及complie(),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • 使用Python對Access讀寫操作

    使用Python對Access讀寫操作

    學(xué)習(xí)Python的過程中,我們會遇到Access的讀寫問題,這時我們可以利用win32.client模塊的COM組件訪問功能,通過ADODB操作Access的文件。下面跟著小編一起來看下吧
    2017-03-03
  • 一文詳解python多繼承的3C算法

    一文詳解python多繼承的3C算法

    有很多地方都說python多繼承的繼承順序,是按照深度遍歷的方式,其實python多繼承順序的算法,不是嚴(yán)格意義上的深度遍歷,而是基于深度遍歷基礎(chǔ)上優(yōu)化出一種叫3C算法,本文將給大家詳細(xì)的介紹一下python多繼承的3C算法,需要的朋友可以參考下
    2024-07-07
  • Python如何腳本過濾文件中的注釋

    Python如何腳本過濾文件中的注釋

    在本篇文章里小編給大家分享的是關(guān)于Python腳本過濾文件中的注釋方法以及實例,需要的朋友們可以學(xué)習(xí)下。
    2020-05-05
  • Python獲取腳本所在目錄的正確方法

    Python獲取腳本所在目錄的正確方法

    這篇文章主要介紹了Python獲取腳本所在目錄的正確方法,需要的朋友可以參考下
    2014-04-04
  • 對python Tkinter Text的用法詳解

    對python Tkinter Text的用法詳解

    今天小編就為大家分享一篇對python Tkinter Text的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10

最新評論

临武县| 霍邱县| 福清市| 华容县| 上栗县| 宁安市| 天等县| 新兴县| 满城县| 武定县| 竹溪县| 明水县| 光山县| 杂多县| 楚雄市| 霸州市| 平塘县| 彰化市| 永登县| 城固县| 博白县| 历史| 贵州省| 鄂伦春自治旗| 克拉玛依市| 泸水县| 嘉荫县| 鄂托克旗| 通许县| 合山市| 西盟| 蕲春县| 上蔡县| 江源县| 天祝| 宜州市| 洛南县| 东源县| 迭部县| 太保市| 宜城市|