思路:使用UI+接口的方式來查找驗證碼圖片和獲取驗證碼元素進行參數輸入(用截圖方式)(非圖片類型驗證碼無法實現)
我們以訪問當當網的注冊界面來演示
1.通過selenium定位查找驗證碼並截圖保留
1引入selenium包,創建web驅動,進入登錄界面,執行無誤
2創建截圖函數:查找驗證碼元素,截下當前的圖片
定位驗證碼圖片
對驗證碼圖片進行截圖
使用代碼獲取驗證碼圖片左上角的坐標(x,y),使用代碼獲取驗證碼圖片的長度和寬度,求出兩個對角的橫縱坐標(四個邊的x,y坐標)
3通過已經獲得的驗證碼的兩個對角線的點的四個坐標將驗證碼截圖(后面用接口獲取值)
獲取到的截圖
這部分實現的代碼
2. 新建獲取驗證碼函數,通過接口方法獲取驗證碼
1這個操作需要花錢,參考網址:https://www.showapi.com/apiGateway/view?apiCode=184
2注冊登錄並購買套餐(花錢就行,注意使用時的消耗和次數)推薦買最便宜的試,有需要再說
3使用方法:根據當前驗證碼的規則是4位英文字母,所以我們使用只含英數字符的就行
檢查驗證碼類型和長度(當前驗證碼是四位,且均是英文字母)
選擇業務類型(因此選擇英文數字類型的待識別內容)
4選擇操作語言,查看指引方法(上一張圖往下滾)
選擇語言后出現代碼的指引操作,點擊下載右邊的SDK下載(soft-develop-kit 軟件開發包)
下載是一個zip壓縮包,解壓后是一個py同名不同格式名的文件
將這個文件放到工作路徑並引用,引用方法參照代碼指引,並需要下載接口請求的requests庫
調用這個文件里的方法我們需要三個參數(url;my_appid;my_appsecret)其中接口地址在上面已給出
my_appid和my_secret在登錄后的個人中心——我的應用處獲取 my_secret需要輸入密碼
查看appid
查看密碼(得先輸入登錄密碼)
其他操作內容——對文件的獲取,以及內容及長度的識別,這里只展示使用方法,上面有使用參數的介紹,根據個人需要配置參數,最后調用發送請求獲取響應
使用方法介紹
參數介紹
5完成驗證碼函數的代碼實現
6使用變量接收獲取到的驗證碼,定位到輸入框,輸入獲取到的驗證碼
7一切都准備好后,點擊運行
最后附上全部代碼
from selenium import webdriver
from PIL import Image
from ShowapiRequest import ShowapiRequest
driver = webdriver.Chrome()
driver.get("https://login.dangdang.com/register.php?returnurl=http://book.dangdang.com/?_utm_brand_id=11106&_ddclickunion=460-5-biaoti|ad_type=0|sys_id=1")
def screen_shot():
driver.save_screenshot(r"D:\zhuce.png") #截下當前頁面的圖
left_angle = driver.find_element_by_id("imgVcode").location #獲取驗證碼左上角坐標
print(left_angle) #查看驗證碼圖片左上角點的坐標
left = left_angle["x"] #獲取驗證碼圖片最左邊的x軸坐標
top = left_angle["y"] #獲取驗證碼圖片最上面的y軸坐標
image = driver.find_element_by_id("imgVcode") #對整個圖片進行定位
width = image.size["width"] #獲取圖片的寬度
height = image.size["height"] #獲取圖片的高度
right = left+width #獲取驗證碼圖片最右邊的x軸坐標
down = top+height #獲取驗證碼圖片最下面的y軸坐標
print(left,top,right,down) #打印四個角的橫縱坐標
openim = Image.open(r"D:\zhuce.png") #打開剛才截下的整個的圖片
jietu = openim.crop((left,top,right,down)) #通過剛才獲得的四個坐標進行截圖(Imagez中的方法) 這里是兩個小括號
jietu.save(r"D:\xi.png") #截取驗證碼的小圖並繼續保存
def yanzhengma():
yz = ShowapiRequest("http://route.showapi.com/184-4","104117","6baff26b20aa48edb6584955c0e08559")
yz.addFilePara("image",r"D:\xi.png") #小驗證碼的照片來源
yz.addBodyPara("typeId","24") #這個是純英文數字,我輸入24就可以
yz.addBodyPara("convert_to_jpg","0") #照片類型不做轉換
yz.addBodyPara("needMorePrecise","1") #精度轉換
res = yz.post().json() #獲取json格式的響應,方便取值
d = res["showapi_res_body"]["Result"] #獲取Result下的驗證碼的值
print(d) #打印
return d #返回
if __name__=="__main__":
screen_shot()
c = yanzhengma() #賦值 用於輸入
driver.find_element_by_id("txt_vcode").send_keys(c)
補充一下,這個套餐有次數和時間限制,想知道使用情況可以登錄並查看即時情況
本篇博文雖然用的是Python,但驗證碼接口識別支持多種語言。也可以用其他語言實現