Python小紅書旋轉(zhuǎn)驗(yàn)證碼識(shí)別實(shí)戰(zhàn)教程
本周免費(fèi)接了一個(gè)用戶的需求,研究了一下小紅書旋轉(zhuǎn)驗(yàn)證碼。剛開始小瞧了它,覺(jué)得它應(yīng)該沒(méi)有百度旋轉(zhuǎn)驗(yàn)證碼那么難,畢竟圖像沒(méi)有干擾,需要的訓(xùn)練樣本就可以很少。然而事情并沒(méi)有這么簡(jiǎn)單,所以記錄一下。
首先看一下最終的效果:
驗(yàn)證碼識(shí)別過(guò)程
1、利用爬蟲采集圖像
這里最好大小圖都采集,剛開始我就只采集了小圖,就踩了一個(gè)坑,因?yàn)橹挥行D很難通過(guò)小圖旋轉(zhuǎn)到正確位置。并不能通過(guò)眼睛等特征來(lái)確定是否選擇正了,因?yàn)橛泻芏鄨D片本身頭的歪的。所以就會(huì)導(dǎo)致最終識(shí)別結(jié)果偏差較大。
(1)采集大圖
(2)采集小圖
2、人工標(biāo)記
為了保證旋轉(zhuǎn)到正確的角度,我還專門開發(fā)了一個(gè)標(biāo)記小工具如下圖。
可以通過(guò)拖動(dòng)滑塊旋轉(zhuǎn)小圖到大概位置,再通過(guò)點(diǎn)擊按鈕進(jìn)行微調(diào),旋轉(zhuǎn)到絕對(duì)正確的角度。
這樣能保證我標(biāo)記的圖片角度100%正確,只有提升了標(biāo)記數(shù)據(jù)的質(zhì)量,才會(huì)讓最終識(shí)別的效果達(dá)到最好。
3、訓(xùn)練模型
4、測(cè)試驗(yàn)證
我們將訓(xùn)練好的模型用100張圖片來(lái)進(jìn)行測(cè)試,發(fā)現(xiàn)只有4張圖片旋轉(zhuǎn)角度有問(wèn)題,所以最終模型的實(shí)際正確率為96%。
如果再想提升正確率,可以再增加訓(xùn)練的數(shù)據(jù)量,就需要再投入大量人力,這個(gè)投入與提升產(chǎn)出比需要自己權(quán)衡。
5、實(shí)戰(zhàn)測(cè)試
這里我就直接上代碼,就是文章開通動(dòng)圖的演示效果。我也將模型封裝成了免費(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)證碼識(shí)別接口 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ǔ)義類型驗(yàn)證碼的文本描述(這里缺省為空字符串) "words":"" } header = {"Content-Type": "application/json"} # 發(fā)送請(qǐng)求調(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') # 加載防檢測(cè)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('順時(shí)針旋轉(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"]') # 滑動(dòng)滑塊 action = ActionChains(driver) action.click_and_hold(tag2).perform() time.sleep(1) # 計(jì)算實(shí)際滑動(dòng)距離 = 像素距離 + 前面空白距離 move_x = angle * 0.79 # 滑動(dòng)1:直接滑動(dòng) action.move_by_offset(move_x, 5) # 滑動(dòng)2:分段滑動(dòng) # 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)注變簡(jiǎn)單了,圖像種類比百度少了一半。
(2)和百度相比,對(duì) selenium 檢測(cè)更厲害了,我用火狐+反檢測(cè)一直過(guò)不了,使用谷歌+反檢測(cè)可以通過(guò),但是滑對(duì)了也會(huì)多次驗(yàn)證
(3)和百度相比,滑動(dòng)軌跡檢測(cè)更厲害了,目前不是太確定,因?yàn)槲乙淮慰焖倩瑒?dòng),還是分段滑動(dòng)效果感覺(jué)差不多
各位大神如果對(duì)滑動(dòng)提高通過(guò)率,或者有其他建議都可以給我留言,或私信我,謝謝指點(diǎn)。
到此這篇關(guān)于Python小紅書旋轉(zhuǎn)驗(yàn)證碼識(shí)別的文章就介紹到這了,更多相關(guān)python旋轉(zhuǎn)驗(yàn)證碼識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python圖形驗(yàn)證碼識(shí)別教程詳解
- Python通用驗(yàn)證碼識(shí)別OCR庫(kù)ddddocr的安裝使用教程
- Python通用驗(yàn)證碼識(shí)別OCR庫(kù)之ddddocr驗(yàn)證碼識(shí)別
- Python免費(fèi)驗(yàn)證碼識(shí)別之ddddocr識(shí)別OCR自動(dòng)庫(kù)實(shí)現(xiàn)
- python調(diào)用文字識(shí)別OCR輕松搞定驗(yàn)證碼
- python網(wǎng)絡(luò)爬蟲之模擬登錄 自動(dòng)獲取cookie值 驗(yàn)證碼識(shí)別的具體實(shí)現(xiàn)
- 非常簡(jiǎn)單的Python識(shí)別圖片驗(yàn)證碼實(shí)現(xiàn)過(guò)程
相關(guān)文章
詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等)
這篇文章主要介紹了詳解利用OpenCV提取圖像中的矩形區(qū)域(PPT屏幕等),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-07-07Python實(shí)現(xiàn)emoji表情的簡(jiǎn)單方法
“表情包”是一種利用圖片來(lái)表示感情的一種方式。下面這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)emoji表情的簡(jiǎn)單方法,需要的朋友可以參考下2021-05-05解決python3中的requests解析中文頁(yè)面出現(xiàn)亂碼問(wèn)題
requests是一個(gè)很實(shí)用的Python HTTP客戶端庫(kù),編寫爬蟲和測(cè)試服務(wù)器響應(yīng)數(shù)據(jù)時(shí)經(jīng)常會(huì)用到。這篇文章給大家介紹了解決python3中的requests解析中文頁(yè)面出現(xiàn)亂碼問(wèn)題,感興趣的朋友一起看看吧2019-04-04淺談Keras中fit()和fit_generator()的區(qū)別及其參數(shù)的坑
這篇文章主要介紹了Keras中fit()和fit_generator()的區(qū)別及其參數(shù)的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05pytorch 使用加載訓(xùn)練好的模型做inference
今天小編就為大家分享一篇pytorch 使用加載訓(xùn)練好的模型做inference,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python Sweetviz輕松實(shí)現(xiàn)探索性數(shù)據(jù)分析
Sweetviz是一個(gè)開放源代碼Python庫(kù),可生成精美的高密度可視化文件,以單行代碼啟動(dòng)EDA(探索性數(shù)據(jù)分析)。輸出是一個(gè)完全獨(dú)立的HTML應(yīng)用程序,該系統(tǒng)圍繞快速可視化目標(biāo)值和比較數(shù)據(jù)集而構(gòu)建。其目標(biāo)是幫助快速分析目標(biāo)特征,訓(xùn)練與測(cè)試數(shù)據(jù)以及其他此類數(shù)據(jù)表征任務(wù)2021-11-11