最新驗(yàn)證碼識別模擬登陸B(tài)站
「本文目錄」
1 分析登錄界面結(jié)構(gòu) 2 使用selenium打開登錄頁面 3 獲取頁面當(dāng)前驗(yàn)證碼圖片 4 使用超級鷹識別驗(yàn)證碼 5 對獲取的坐標(biāo)數(shù)據(jù)進(jìn)行提取,并用動作鏈完成點(diǎn)擊

1 分析登錄界面結(jié)構(gòu)


下面用兩種方法進(jìn)行驗(yàn)證碼的獲取,然后提交給「超級鷹」進(jìn)行識別,接收到漢字的坐標(biāo)后,處理數(shù)據(jù),然后用動作鏈進(jìn)行點(diǎn)擊操作,最后定位點(diǎn)擊確認(rèn),登陸成功。
2 使用selenium打開登錄頁面
「代碼實(shí)現(xiàn):」
#?使用selenium打開登錄界面
bro?=?webdriver.Chrome(executable_path='./chromedriver')
bro.get('https://passport.bilibili.com/login')
#?定位用戶名,密碼輸入框
username?=?bro.find_element_by_id('login-username')
password?=?bro.find_element_by_id('login-passwd')
sleep(1)
#?將自己的用戶名密碼替換xxxxxx
username.send_keys('xxxxxx')
sleep(1)
password.send_keys('xxxxxx')
sleep(1)
#?定位登錄按鈕并點(diǎn)擊
bro.find_element_by_xpath('//*[@id="geetest-wrap"]/div/div[5]/a[1]').click()
sleep(2)
3 獲取頁面當(dāng)前驗(yàn)證碼圖片
3.1 方法一:頁面截圖,將驗(yàn)證碼區(qū)域進(jìn)行裁剪保存

首先做的當(dāng)然是將點(diǎn)擊登錄后的頁面進(jìn)行截圖,然后定位到驗(yàn)證碼的位置,通過location()方法獲取驗(yàn)證碼左上角的坐標(biāo), size() 獲取驗(yàn)證碼的寬和高,左上角坐標(biāo)加上寬和高就是驗(yàn)證碼右下角的坐標(biāo)。獲取坐標(biāo)后就可以用crop()方法來進(jìn)行裁剪,然后將裁剪到的驗(yàn)證碼圖片保存。
「代碼實(shí)現(xiàn):」
#?本文相關(guān)完整代碼可以關(guān)注微信公眾號:簡說Python,回復(fù):B站?獲取。
#?save_screenshot就是將當(dāng)前頁面進(jìn)行截圖且保存
bro.save_screenshot('page.png')
#?定位驗(yàn)證碼圖片的位置
code_img_ele?=?bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div')
location?=?code_img_ele.location??#?驗(yàn)證碼左上角的坐標(biāo)x,y
size?=?code_img_ele.size??#?驗(yàn)證碼圖片對應(yīng)的長和寬
#?左上角和右下角的坐標(biāo)
#?這里坐標(biāo)乘1.25是由于電腦屏幕的比例不是100%,我的是125%,請自行在設(shè)置中查看
rangle?=?(
????int(location['x']?*?1.25),?int(location['y']?*?1.25),?int((location['x']?+?size['width'])?*?1.25),
????int((location['y']?+?size['height'])?*?1.25)
)
i?=?Image.open('./page.png')
code_img_name?=?'./code.png'
#?crop根據(jù)rangle元組內(nèi)的坐標(biāo)進(jìn)行裁剪
frame?=?i.crop(rangle)
frame.save(code_img_name)
#?縮小圖片,寬為169,高為216
code?=?Image.open('./code.png')
small_img?=?code.resize((169,?216))
small_img.save('./small_img.png')
print(code.size,?small_img.size)
3.2方法二、通過網(wǎng)頁獲取圖片地址,并保存

圖片地址是img標(biāo)簽的src屬性值,通過xpath得到地址,直接對此url發(fā)送請求,接收數(shù)據(jù)并保存即可。
#?本文相關(guān)完整代碼可以關(guān)注微信公眾號:簡說Python,回復(fù):B站?獲取。
#?獲取img標(biāo)簽的src屬性值
img_url?=?bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[2]/div[1]/div/div[2]/img').get_attribute('src')
headers?=?{
????'Users-Agent':?'Mozilla/5.0?(Windows?NT?6.1;?Win64;?x64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/79.0.3945.117?Safari/537.36'
}
#?獲取圖片二進(jìn)制數(shù)據(jù)
img_data?=?requests.get(url=img_url,?headers=headers).content
with?open('./node1.png',?'wb')as?fp:
????fp.write(img_data)
i?=?Image.open('./node1.png')
#?將圖片縮小并保存,設(shè)置寬為172,高為192
small_img?=?i.resize((172,?192))
small_img.save('./small_img1.png')
4 使用超級鷹識別驗(yàn)證碼
#?本文相關(guān)完整代碼可以關(guān)注微信公眾號:簡說Python,回復(fù):B站?獲取。
#?將驗(yàn)證碼提交給超級鷹進(jìn)行識別
chaojiying?=?Chaojiying_Client('用戶名',?'密碼',?'96001')??#?用戶中心>>軟件ID?生成一個(gè)替換?96001
im?=?open('small_img.png',?'rb').read()??#?本地圖片文件路徑?來替換?a.jpg?有時(shí)WIN系統(tǒng)須要//
#?9004是驗(yàn)證碼類型
print(chaojiying.PostPic(im,?9004)['pic_str'])
result?=?chaojiying.PostPic(im,?9004)['pic_str']
5 對獲取的坐標(biāo)數(shù)據(jù)進(jìn)行提取,并用動作鏈完成點(diǎn)擊
我們可以將數(shù)據(jù)以' | '進(jìn)行分割,保存到列表中,再以逗號分割將x,y的坐標(biāo)保存,得到[ [123,12],[234,21] ]這一格式,然后遍歷這一列表,使用動作鏈對每一個(gè)列表元素對應(yīng)的x,y指定的位置進(jìn)行點(diǎn)擊操作,最后定位并點(diǎn)擊確認(rèn),登錄成功。
「代碼實(shí)現(xiàn):」
#?本文相關(guān)完整代碼可以關(guān)注微信公眾號:簡說Python,回復(fù):B站?獲取。
all_list?=?[]??#?要存儲即將被點(diǎn)擊的點(diǎn)的坐標(biāo)??[[x1,y1],[x2,y2]]
if?'|'?in?result:
????list_1?=?result.split('|')
????count_1?=?len(list_1)
????for?i?in?range(count_1):
????????xy_list?=?[]
????????x?=?int(list_1[i].split(',')[0])
????????y?=?int(list_1[i].split(',')[1])
????????xy_list.append(x)
????????xy_list.append(y)
????????all_list.append(xy_list)
else:
????x?=?int(result.split(',')[0])
????y?=?int(result.split(',')[1])
????xy_list?=?[]
????xy_list.append(x)
????xy_list.append(y)
????all_list.append(xy_list)
#?遍歷列表,使用動作鏈對每一個(gè)列表元素對應(yīng)的x,y指定的位置進(jìn)行點(diǎn)擊操作
#?x,y坐標(biāo)乘2和0.8,是由于
for?l?in?all_list:
????x?=?l[0]?*?2?*?0.8
????y?=?l[1]?*?2?*?0.8
????#?將點(diǎn)擊操作的參照物移動到指定的模塊,
????#?若用方法二獲取的驗(yàn)證碼圖片,要添加下面代碼對code_img_ele賦值
????#?code_img_ele?=?bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[2]/div[1]/div/div[2]/img')
????ActionChains(bro).move_to_element_with_offset(code_img_ele,?x,?y).click().perform()
????sleep(0.1)
????print('點(diǎn)擊已完成')
#?完成動作鏈點(diǎn)擊操作后,定位確認(rèn)按鈕并點(diǎn)擊
bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[6]/div/div/div[3]/a').click()更多閱讀
特別推薦

點(diǎn)擊下方閱讀原文加入社區(qū)會員
評論
圖片
表情
