Python小紅書旋轉(zhuǎn)驗(yàn)證碼識別實(shí)戰(zhàn)教程
本周免費(fèi)接了一個用戶的需求,研究了一下小紅書旋轉(zhuǎn)驗(yàn)證碼。剛開始小瞧了它,覺得它應(yīng)該沒有百度旋轉(zhuǎn)驗(yàn)證碼那么難,畢竟圖像沒有干擾,需要的訓(xùn)練樣本就可以很少。然而事情并沒有這么簡單,所以記錄一下。
首先看一下最終的效果:

驗(yàn)證碼識別過程
1、利用爬蟲采集圖像
這里最好大小圖都采集,剛開始我就只采集了小圖,就踩了一個坑,因?yàn)橹挥行D很難通過小圖旋轉(zhuǎn)到正確位置。并不能通過眼睛等特征來確定是否選擇正了,因?yàn)橛泻芏鄨D片本身頭的歪的。所以就會導(dǎo)致最終識別結(jié)果偏差較大。
(1)采集大圖

(2)采集小圖

2、人工標(biāo)記
為了保證旋轉(zhuǎn)到正確的角度,我還專門開發(fā)了一個標(biāo)記小工具如下圖。
可以通過拖動滑塊旋轉(zhuǎn)小圖到大概位置,再通過點(diǎn)擊按鈕進(jìn)行微調(diào),旋轉(zhuǎn)到絕對正確的角度。
這樣能保證我標(biāo)記的圖片角度100%正確,只有提升了標(biāo)記數(shù)據(jù)的質(zhì)量,才會讓最終識別的效果達(dá)到最好。

3、訓(xùn)練模型

4、測試驗(yàn)證
我們將訓(xùn)練好的模型用100張圖片來進(jìn)行測試,發(fā)現(xiàn)只有4張圖片旋轉(zhuǎn)角度有問題,所以最終模型的實(shí)際正確率為96%。
如果再想提升正確率,可以再增加訓(xùn)練的數(shù)據(jù)量,就需要再投入大量人力,這個投入與提升產(chǎn)出比需要自己權(quán)衡。
5、實(shí)戰(zhàn)測試
這里我就直接上代碼,就是文章開通動圖的演示效果。我也將模型封裝成了免費(fèi)的接口給感興趣的小伙伴調(diào)用:得塔云
__author__ = 'Xin Yan Deng'
import os
import sys
import time
import requests
import random
import base64
from io import BytesIO
from PIL import Image
sys.path.append(os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__)))))
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
# PIL圖片保存為base64編碼
def PIL_base64(img, coding='utf-8'):
img_format = img.format
if img_format == None:
img_format = 'JPEG'
format_str = 'JPEG'
if 'png' == img_format.lower():
format_str = 'PNG'
if 'gif' == img_format.lower():
format_str = 'gif'
if img.mode == "P":
img = img.convert('RGB')
if img.mode == "RGBA":
format_str = 'PNG'
img_format = 'PNG'
output_buffer = BytesIO()
# img.save(output_buffer, format=format_str)
img.save(output_buffer, quality=100, format=format_str)
byte_data = output_buffer.getvalue()
base64_str = 'data:image/' + img_format.lower() + ';base64,' + base64.b64encode(byte_data).decode(coding)
return base64_str
# 驗(yàn)證碼識別接口
def shibie(img):
url = "http://www.detayun.cn/openapi/verify_code_identify/"
data = {
# 用戶的key
"key":"",
# 驗(yàn)證碼類型
"verify_idf_id":"24",
# 樣例圖片
"img_base64":PIL_base64(img),
"img_byte": None,
# 中文點(diǎn)選,空間語義類型驗(yàn)證碼的文本描述(這里缺省為空字符串)
"words":""
}
header = {"Content-Type": "application/json"}
# 發(fā)送請求調(diào)用接口
response = requests.post(url=url, json=data, headers=header)
print(response.text)
return response.json()
driver = webdriver.Chrome(executable_path='.\webdriver\chromedriver.exe')
# 加載防檢測js
with open('.\webdriver\stealth.min.js') as f:
js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": js
})
driver.get('https://www.xiaohongshu.com/website-login/captcha?redirectPath=https%3A%2F%2Fwww.xiaohongshu.com%2Fexplore&verifyUuid=shield-4f9bcc31-0bc0-462a-843a-e60239713e46&verifyType=101&verifyBiz=461')
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": js
})
time.sleep(5)
for i in range(10):
# 等待【旋轉(zhuǎn)圖像】元素出現(xiàn)
WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath('//div[@id="red-captcha-rotate"]/img'))
# 找到【旋轉(zhuǎn)圖像】元素
tag1 = driver.find_element_by_xpath('//div[@id="red-captcha-rotate"]/img')
# 獲取圖像鏈接
img_url = tag1.get_attribute('src')
print(img_url)
header = {
"Host": "picasso-static.xiaohongshu.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive",
"Cookie": "xsecappid=login; a1=1896916369fehn0yq7nomanvre3fghfkj0zubt7zx50000120287; webId=75af27905db67b6fcb29a4899d200062; web_session=030037a385d8a837e5e590cace234a6e266fd5; gid=yYjKjyK484VKyYjKjyKqK89WjidxI8vAWIl6uuC0IhFdq728ikxiTD888yJ8JYW84DySKW0Y; webBuild=2.17.8; websectiga=634d3ad75ffb42a2ade2c5e1705a73c845837578aeb31ba0e442d75c648da36a; sec_poison_id=41187a04-9f82-4fbc-8b98-d530606b7696",
"Upgrade-Insecure-Requests": "1",
"If-Modified-Since": "Thu, 06 Jul 2023 11:42:07 GMT",
"If-None-Match": '"7e53c313a9f321775e8f5e190de21081"',
"TE": "Trailers",
}
# 下載圖片
response = requests.get(url=img_url, headers=header)
img = Image.open(BytesIO(response.content))
img.convert('RGB').save('train_img/{}.jpg'.format(int(time.time() * 1000)))
res = shibie(img)
angle = int(str(res['data']['res_str']).replace('順時針旋轉(zhuǎn)','').replace('度',''))
print(angle)
# img = img.rotate(360 - angle, fillcolor=(0, 0, 0))
# img.show()
# 等待【旋轉(zhuǎn)圖像】元素出現(xiàn)
WebDriverWait(driver, 5).until(lambda x: x.find_element_by_xpath('//div[@class="red-captcha-slider"]'))
# 找到【旋轉(zhuǎn)圖像】元素
tag2 = driver.find_element_by_xpath('//div[@class="red-captcha-slider"]')
# 滑動滑塊
action = ActionChains(driver)
action.click_and_hold(tag2).perform()
time.sleep(1)
# 計算實(shí)際滑動距離 = 像素距離 + 前面空白距離
move_x = angle * 0.79
# 滑動1:直接滑動
action.move_by_offset(move_x, 5)
# 滑動2:分段滑動
# n = (random.randint(3, 5))
# move_x = move_x / n
# for i in range(n):
# action.move_by_offset(move_x, 5)
# time.sleep(0.01)
time.sleep(1)
action.release().perform()
time.sleep(2)
6、總結(jié)分析
(1)和百度相比,圖片標(biāo)注變簡單了,圖像種類比百度少了一半。
(2)和百度相比,對 selenium 檢測更厲害了,我用火狐+反檢測一直過不了,使用谷歌+反檢測可以通過,但是滑對了也會多次驗(yàn)證
(3)和百度相比,滑動軌跡檢測更厲害了,目前不是太確定,因?yàn)槲乙淮慰焖倩瑒樱€是分段滑動效果感覺差不多
各位大神如果對滑動提高通過率,或者有其他建議都可以給我留言,或私信我,謝謝指點(diǎn)。
到此這篇關(guān)于Python小紅書旋轉(zhuǎn)驗(yàn)證碼識別的文章就介紹到這了,更多相關(guān)python旋轉(zhuǎn)驗(yàn)證碼識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python3 使用selenium插件爬取蘇寧商家聯(lián)系電話
這篇文章主要介紹了Python3 selenium爬取蘇寧商家聯(lián)系電話,此處使用了selenium插件 使用的是火狐瀏覽器 信息存儲到csv表格里面,需要的朋友可以參考下2019-12-12
Python連接HDFS實(shí)現(xiàn)文件上傳下載及Pandas轉(zhuǎn)換文本文件到CSV操作
這篇文章主要介紹了Python連接HDFS實(shí)現(xiàn)文件上傳下載及Pandas轉(zhuǎn)換文本文件到CSV操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
詳解Python中的內(nèi)建函數(shù),可迭代對象,迭代器
這篇文章主要介紹了Python內(nèi)建函數(shù),可迭代對象,迭代器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Python中filter與lambda的結(jié)合使用詳解
今天小編就為大家分享一篇Python中filter與lambda的結(jié)合使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12

