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

Python實現(xiàn)滑塊拼圖驗證碼詳解

 更新時間:2022年05月06日 16:01:50   作者:Triumph19  
驗證碼作為一種自然人的機器人的判別工具,被廣泛的用于各種防止程序做自動化的場景中。傳統(tǒng)的字符型驗證安全性已經名存實亡的情況下,各種新型的驗證碼如雨后春筍般涌現(xiàn),今天給大家分享一篇Python實現(xiàn)滑塊驗證碼

滑動拼圖驗證碼可以算是滑塊驗證碼的進階版本,其驗證機制相對復雜。本節(jié)將介紹兩種滑動拼圖驗證碼:初級版和高級版本。

初級版滑塊拼圖驗證碼

  • 初級版滑動拼圖驗證碼是在普通滑塊驗證碼的基礎上增加了隨機的滑動距離,用戶需要根據拼圖的缺口位置來決定滑塊的滑動位置。
  • 如下左圖所示為一個滑塊拼圖驗證碼的起始狀態(tài),注意此時還沒有顯示拼圖和缺口。單擊滑塊后就會出現(xiàn)拼圖和缺口,如下右圖所示。之后會利用這一特性來找到拼圖和缺口的位置。

  • 下面開始編寫代碼。首先用Selenium打開網頁,代碼如下:
from selenium import webdriver
browser =webdriver.Chrome()
url = r'D:\works\python_crawl1\《Python爬蟲(進階與進通)》代碼匯總\2.驗證碼反爬\4.滑動拼圖驗證碼\滑動拼圖驗證碼初級\index.html'
browser.get(url) #用模擬瀏覽器打開網頁
  • 然后定位滑塊并模擬單擊滑塊,讓拼圖和缺口顯現(xiàn)出來。雖然此時單擊滑塊會顯示驗證失敗,但這是為了幫助我們獲取拼圖和缺口的真實位置,以計算滑塊需要滑動的距離,代碼如下:
slider = browser.find_element_by_xpath('//*[@id="slideBtn"]') #定位滑塊
slider.click() # 模擬單擊滑塊,讓拼圖和缺口顯現(xiàn)出來
time.sleep(3) #等待3秒
  • 接著需要找到缺口的位置,初級版滑動拼圖驗證碼可以直接在網頁源代碼中找到。如下圖所示,用元素定位工具選中缺口,在網頁源代碼中查看缺口的left屬性值,即缺口的左邊界到整張圖片的左邊界的距離,這里為135像素。

如下圖所示,用同樣的方法查看拼圖的left屬性值,即拼圖的左邊界到整張圖片的左邊界的距離,這里為2像素。

因為拼圖的初始left屬性值始終為2像素,所以只需要提取缺口的left屬性值。這里用正則表達式來提取,代碼如下:

import re
data = browser.page_source #獲取網頁源代碼
p_qk = '<div class="slide-box-shadow".*?left: (.*?)px' #編寫正則表達式
qk_left = re.findall(p_qk,data,re.S) #提取缺口的left屬性值

獲得qk_left如下:

將缺口和拼圖的left屬性值相減,就可以得到滑塊需要滑動的距離,代碼如下:

distance = float(qk_left[0]) - float(2) #用float()函數將數據都切換為浮點數(即帶小數點的數)

計算結果如下:

計算出滑動距離后,用2.3節(jié)講解的方法進行模擬滑動即可,代碼如下:

action = webdriver.ActionChains(browser) # 啟動動作鏈
action.click_and_hold(slider).perform() #按住滑塊
action.move_by_offset(distance,0) #移動滑塊,其中的distance是之前計算出來的需要滑動的距離,第二個參數0則為y軸方向移動的距離,因為這里不需要y軸方向移動,所以為設置為0
action.release().perform() #釋放滑塊

完整代碼如下:

# 完整代碼如下
import time
from selenium import webdriver
# 1.訪問網址
browser =webdriver.Chrome()
url = r'D:\works\python_crawl1\《Python爬蟲(進階與進通)》代碼匯總\2.驗證碼反爬\4.滑動拼圖驗證碼\滑動拼圖驗證碼初級\index.html'
browser.get(url) #用模擬瀏覽器打開網頁
# 2.定位滑塊并模擬單擊,讓缺口顯現(xiàn)出來
slider = browser.find_element_by_xpath('//*[@id="slideBtn"]') #定位滑塊
slider.click() # 模擬單擊滑塊,讓拼圖和缺口顯現(xiàn)出來
time.sleep(3) #等待3秒
# 3.獲得缺口位置
data = browser.page_source #獲取網頁源代碼
p_qk = '<div class="slide-box-shadow".*?left: (.*?)px' #編寫正則表達式
qk_left = re.findall(p_qk,data,re.S) #提取缺口的left屬性值
print(qk_left)
# 4.計算滑塊需要滑動的距離
distance = float(qk_left[0]) - float(2) #用float()函數將數據都切換為浮點數(即帶小數點的數)
print(distance)
# 5.開始滑動
action = webdriver.ActionChains(browser) # 啟動動作鏈
action.click_and_hold(slider).perform() #按住滑塊
action.move_by_offset(distance,0) #移動滑塊,其中的260是之前計算出來的需要滑動的距離
action.release().perform() #釋放滑塊

補充知識點

如果不希望滑動得太快,可以將滑動距離分為3段,讓滑塊分3次滑動,每次滑動后等待一定時間,代碼如下:

x1 = distance / 3
x2 = x1
x3 = distance - x1 - x2
action.move_by_offset(x1,0)
time.sleep(1)
action.move_by_offset(x2,0)
time.sleep(1)
action.move_by_offset(x3,0)
time.sleep(1)
action.release().perform()

高級版滑動拼圖驗證碼

  • 初級版滑動拼圖驗證碼將拼圖和缺口的位置都寫在網頁源代碼中,我們可以直接根據left屬性值計算滑動距離,從而通過驗證。而高級版滑動拼圖驗證碼將缺口融入背景圖,我們無法在網頁源代碼中找到拼圖和缺口的位置,這就為這種驗證碼的模擬驗證增加了不小的難度。
  • 人類是通過對比無缺口的圖像和有缺口的圖像,從而計算出滑塊需要滑動的距離。在命令行窗口中執(zhí)行命令“pip install pillow”即可安裝PIL庫。
  • 首先用Selenium庫打開網頁,代碼如下:
from selenium import webdriver
browser = webdriver.Chrome()
url = r'D:\works\python_crawl1\《Python爬蟲(進階與進通)》代碼匯總\2.驗證碼反爬\4.滑動拼圖驗證碼\滑動拼圖驗證碼高級\index.html'
browser.get(url) #用模擬瀏覽器打開網頁

通過XPath表達式定位驗證碼原始圖片,截圖并保存,代碼如下:

browser.find_element_by_xpath('//*[@id="jigsawCanvas"]').screenshot('origin.png') #截圖無缺口圖像

截取到的無缺口圖像如下圖所示:

接著模擬單擊滑塊,會出現(xiàn)缺口,再次截圖并保存,代碼如下:

slider = browser.find_element_by_xpath('//*[@id="jigsawCircle"]') #定位滑塊
slider.click() #模擬單擊滑塊,讓圖像出現(xiàn)缺口
browser.find_element_by_xpath('//*[@id="jigsawCanvas"]').screenshot('after.png') #截取有缺口的圖片

截取到的有缺口圖像如下圖所示:

可以看到,無缺口圖像和有缺口圖像知識缺口處不同,其他地方完全相同。對比兩幅圖像的像素,將不同的像素找出來,就能知道缺口的位置。PIL庫提供的ImageChops模塊可以對比兩幅圖像的異同,并給出缺口的位置。通過如下代碼從PIL庫中導入需要使用的模塊:

from PIL import Image,ImageChops

用Image模塊中的open()函數打開要對比的兩張截圖,代碼如下:

image_a = Image.open('origin.png').convert('RGB')
image_b = Image.open('after.png').convert('RGB')

接著用ImageChops模塊中的difference()函數對比兩張截圖的像素,并獲取不同之處的坐標值(注意,這種驗證碼的缺口位置每次都會變化,所以每次獲得的坐標值也不一樣)代碼如下:

x = ImageChops.difference(image_a,image_b).getbbox()
print(x)

(261, 21, 313, 72)

getbbox()函數會以元組的形式返回缺口的一組坐標值。

distance = x[0] #第1個元素為缺口的左邊界到圖像的左邊界的距離
distance

接著用開發(fā)者工具查看白色圓角矩形的left屬性值,也就是圓角矩形的左邊界到圖像的左邊界的距離,如下圖所示:

將前面獲取的兩個距離相減,就是滑塊需要移動的距離。下面來移動滑塊,代碼如下:

action = webdriver.ActionChains(browser) # 啟動動作鏈
action.click_and_hold(slider).perform() #按住滑塊
action.move_by_offset(distance-10,0) #移動滑塊,其中的260是之前計算出來的需要滑動的距離
action.release().perform() #釋放滑塊

完整代碼如下:

from selenium import webdriver
import time
from PIL import Image,ImageChops
# 1.訪問網址
browser = webdriver.Chrome()
url = r'D:\works\python_crawl1\《Python爬蟲(進階與進通)》代碼匯總\2.驗證碼反爬\4.滑動拼圖驗證碼\滑動拼圖驗證碼高級\index.html'
browser.get(url) #用模擬瀏覽器打開網頁
time.sleep(2)
# 2.獲取無缺口圖像
browser.find_element_by_xpath('//*[@id="jigsawCanvas"]').screenshot('origin.png') #截圖無缺口圖像
# 3.獲取有缺口圖像
slider = browser.find_element_by_xpath('//*[@id="jigsawCircle"]') #定位滑塊
slider.click() #模擬單擊滑塊,讓圖像出現(xiàn)缺口
browser.find_element_by_xpath('//*[@id="jigsawCanvas"]').screenshot('after.png') #截取有缺口的圖片
# 4.比較兩幅圖像,獲取需要移動的距離
image_a = Image.open('origin.png').convert('RGB')
image_b = Image.open('after.png').convert('RGB')
x = ImageChops.difference(image_a,image_b).getbbox()
print(x)
distance = x[0] #第1個元素為缺口的左邊界到圖像的左邊界的距離
distance
# 5.開始滑動
action = webdriver.ActionChains(browser) # 啟動動作鏈
action.click_and_hold(slider).perform() #按住滑塊
action.move_by_offset(distance-10,0) #移動滑塊,其中的260是之前計算出來的需要滑動的距離
action.release().perform() #釋放滑塊

運行結果如下,可以看到成功地通過了驗證

到此這篇關于Python實現(xiàn)滑塊拼圖驗證碼詳解的文章就介紹到這了,更多相關Python滑塊拼圖驗證碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python如何批量更改圖像尺寸統(tǒng)一大小

    Python如何批量更改圖像尺寸統(tǒng)一大小

    這篇文章主要介紹了Python如何批量更改圖像尺寸統(tǒng)一大小問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 如何用Python實現(xiàn)自動發(fā)送微博

    如何用Python實現(xiàn)自動發(fā)送微博

    大家好,本篇文章主要講的是如何用Python實現(xiàn)自動發(fā)送微博,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏
    2022-01-01
  • pytorch中的numel函數用法說明

    pytorch中的numel函數用法說明

    這篇文章主要介紹了pytorch中的numel函數用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • 如何用Python中19行代碼把照片寫入到Excel中

    如何用Python中19行代碼把照片寫入到Excel中

    這篇文章主要介紹了如何利用Python3中的19行代碼把照片寫入到Excel中,文章內容實現(xiàn)的不是截取一張圖片,粘貼到excel,而是通過像素寫入到excel中,需要的朋友可以參考一下
    2022-02-02
  • Python unittest單元測試openpyxl實現(xiàn)過程解析

    Python unittest單元測試openpyxl實現(xiàn)過程解析

    這篇文章主要介紹了Python unittest單元測試openpyxl實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • Python發(fā)送以整個文件夾的內容為附件的郵件的教程

    Python發(fā)送以整個文件夾的內容為附件的郵件的教程

    這篇文章主要介紹了Python發(fā)送以整個文件夾的內容為附件的郵件的教程,普通我們在運營商免費郵箱中發(fā)附件通常只能發(fā)文件而不能發(fā)文件夾,而該腳本則可以實現(xiàn)文件夾的發(fā)送(自己動手編程的強大之處:D),需要的朋友可以參考下
    2015-05-05
  • Pytorch之tensorboard無法啟動和顯示問題及解決

    Pytorch之tensorboard無法啟動和顯示問題及解決

    這篇文章主要介紹了Pytorch之tensorboard無法啟動和顯示問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python進階_關于命名空間與作用域(詳解)

    Python進階_關于命名空間與作用域(詳解)

    下面小編就為大家?guī)硪黄狿ython進階_關于命名空間與作用域(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Python+PyQt5編寫圖片格式轉換器

    Python+PyQt5編寫圖片格式轉換器

    這篇文章主要為大家詳細介紹了如何利用Python和PyQt5編寫一個簡單的圖片格式轉換器,文中的示例代碼講解詳細,感興趣的小伙伴可以動手嘗試一下
    2023-07-07
  • TensorFlow 多元函數的極值實例

    TensorFlow 多元函數的極值實例

    今天小編就為大家分享一篇TensorFlow 多元函數的極值實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02

最新評論

安徽省| 沭阳县| 东平县| 武宁县| 临高县| 鲁山县| 阿勒泰市| 苏尼特右旗| 沾益县| 西峡县| 元氏县| 嘉兴市| 筠连县| 称多县| 晋中市| 荔波县| 榆社县| 宁安市| 蒙阴县| 自贡市| 庆阳市| 山西省| 靖江市| 邢台县| 临夏市| 武定县| 达日县| 丰顺县| 哈尔滨市| 昔阳县| 德昌县| 江津市| 临颍县| 大石桥市| 昌吉市| 钟山县| 梅州市| 牡丹江市| 武胜县| 广丰县| 应用必备|