Python+Selenium-20-圖片驗證碼處理

前言

有些註冊頁面會含有驗證碼,本篇描述在selenium中對驗證碼的處理實例

 

需求

打開萬維易源註冊頁面:https://www.showapi.com/auth/reg  (這個是第三方api平臺易源接口,後面驗證碼識別用的就是他的)

在註冊頁面中包含驗證碼的操作

 

需求分析

1)打開控制檯,點擊上方截圖中的驗證碼圖片,在network中會有一條請求信息(這裏爲獲取驗證碼圖片的請求)

2)瀏覽器直接打開(發現打開的圖片驗證碼並不是我們在註冊頁面看到的,瀏覽器刷新一下,發現每次圖片都是變化的不固定的,因此我們不能直接通過請求來獲取這個驗證碼圖片)

3) 那我們怎麼將驗證碼圖片保存下來呢?

解決辦法:在註冊頁面將驗證碼圖片的位置獲取到,利用python中的pillow模塊將圖片切下後保存下來

 

代碼第一部分(保存驗證碼圖片)

1)使用PIL裁切圖片需使用PIL引用Image模塊(pip install pillow直接安裝

2)Image.open(file)方法可以返回打開的圖片

3)使用crop((x0,y0,x1,y1))方法可以對圖片做裁切;依次爲起始點的橫座標、起始點的縱座標、距離原點的寬度、高度

3)查找到元素,通過element.location可以得到x0,y0;通過element.size計算得到x1,y1即可

# coding:utf-8
from selenium import webdriver
from PIL import Image

driver = webdriver.Chrome()
driver.get("https://www.showapi.com/auth/reg")
# 1.將註冊頁面截圖保存,這裏需要以png結尾,其他圖片格式會有warning
driver.save_screenshot("img/scr_img.png")
# 2.定位到驗證碼圖片元素
code_ele = driver.find_element_by_id("checkImg")
# 3.元素的位置,結果:{'y': 478, 'x': 565},爲圖片左上角的位置
print(code_ele.location)
# 4.元素的大小,結果:{'height': 37, 'width': 135}
print(code_ele.size)
# 5.得到將元素的具體位置
x0 = code_ele.location["x"]  # 565
y0 = code_ele.location["y"]   # 478
x1 = code_ele.size["width"] + x0
y1 = code_ele.size["height"] + y0
img = Image.open("img/scr_img.png")
image = img.crop((x0,y0,x1,y1))  # 左、上、右、下
image.save("img/code_img.png")  # 將驗證碼圖片保存爲code_img.png

打開img文件夾,驗證碼的圖片被保存下來了 

 

識別驗證碼

1)首先想到使用到python中的pytesseract模塊(安裝以及簡單使用教程),但是試了一下沒有將驗證碼字符串打印出來,這個模塊只適合沒有干擾項,特別簡單的驗證碼,然而在一般的項目中非常簡單的這種是不存在的

2)一般關於驗證碼的處理會在測試過程中直接去掉,或者設置成萬能驗證碼,如果一定要對驗證碼操作的話,爲保證正常獲取的話需要藉助第三方平臺,這種平臺很多,他們會提供調用的接口,我們直接調用拿到結果就可以了,但是一般都是收費的,這裏就做簡單演示吧(我這裏花了0.1元購買了試了一下,確實好用,哈哈)

 

3)查看一下關於python 語言的調用方式

(具體調用:https://www.showapi.com/apiGateway/view/apiCode=184&pointCode=4

4)首先下載SDK(下載下來是一個zip文件,解壓後爲一個py文件,直接copy到我們的項目中)

5)在我們讀取驗證碼的py文件中直接調用

 ① 這裏爲copy的調用案例

from ShowapiRequest import ShowapiRequest

r = ShowapiRequest("http://route.showapi.com/184-4","my_appId","my_appSecret" )
r.addFilePara("image", "替換爲你的文件")
r.addBodyPara("typeId", "34")
r.addBodyPara("convert_to_jpg", "0")
r.addBodyPara("needMorePrecise", "0")
res = r.post()
print(res.text) # 返回信息

②上方的my_appId,my_appSecret需要付費後在個人中心-我的應用查看

 

代碼部分(完整)

# coding:utf-8
from selenium import webdriver
from PIL import Image
from ShowapiRequest import ShowapiRequest

driver = webdriver.Chrome()
driver.get("https://www.showapi.com/auth/reg")
# 1.將註冊頁面截圖保存,這裏需要以png結尾,其他圖片格式會有warning
driver.save_screenshot("img/scr_img.png")
# 2.定位到驗證碼圖片元素
code_ele = driver.find_element_by_id("checkImg")
# 3.元素的位置,結果:{'y': 478, 'x': 565},爲圖片左上角的位置
# print(code_ele.location)
# 4.元素的大小,結果:{'height': 37, 'width': 135}
# print(code_ele.size)
# 5.得到將元素的具體位置
x0 = code_ele.location["x"]  # 565
y0 = code_ele.location["y"]   # 478
x1 = code_ele.size["width"] + x0
y1 = code_ele.size["height"] + y0
img = Image.open("img/scr_img.png")
image = img.crop((x0,y0,x1,y1))  # 左、上、右、下
image.save("img/code_img.png")  # 將驗證碼圖片保存爲code_img.png
# 6.識別驗證碼
r = ShowapiRequest("http://route.showapi.com/184-4","103296","db501a2c5da647fa9a07d3b4xxxxxxxx" )
r.addBodyPara("img_base64", "")
r.addBodyPara("typeId", "30")
r.addBodyPara("convert_to_jpg", "0")
r.addFilePara("image", "img/code_img.png") # img/code_img.png爲存放的圖片文件
res = r.post()
code_text = res.json()["showapi_res_body"]["Result"]
print(code_text) # 打印返回結果

查看執行結果

打開img目錄查看驗證碼圖片(正確返回了驗證碼內容,之後就可以直接在驗證碼輸入框輸入啦)

 

至此,在selenium中對驗證碼的處理梳理完畢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章