php 图片路径混淆,爬虫遇到了字符图片混淆。pytesseract识别图片字符
本帖最后由 打字的小強 于 2020-6-11 14:05 編輯
最近爬蟲遇到了字符圖片混淆的反爬。如圖所示,文字和圖片混在一起,需要對圖片進行識別,圖片很小,這時候我就想到了pytesseract,一直知道但是從未去實際操作,今天講講基本步驟
QQ截圖20200610131008.png (15.12 KB, 下載次數: 0)
2020-6-11 11:34 上傳
QQ截圖20200611140412.png (33.22 KB, 下載次數: 0)
2020-6-11 14:04 上傳
一.搭建環境
tesseract是很多語言都可以調用的,簡而言之是一個ocr本地識別引擎,所以要裝本地環境,并不是pip install 就可以的。并不是python的專利,可以用這個訓練自己的庫,搭建環境還需要下載簡體中文包
下載tesseract-ocr-setup-4.0.0-alpha.20180109.exe進行安裝,可以選擇安裝位置,記住安裝位置,我的位置是D:\minitool\Tesseract-OCR
QQ截圖20200610132338.png (35.64 KB, 下載次數: 0)
2020-6-11 11:38 上傳
下載簡體中文識別庫chi_sim.traineddata,放到安裝位置的tesseract安裝目錄下tessdata的文件下
QQ截圖20200610132527.png (36.32 KB, 下載次數: 0)
2020-6-11 11:40 上傳
接下來做環境變量的配置,打開我的電腦,右鍵點擊屬性,計算機名,域工作組設置點擊更改設置,點擊高級,點擊環境變量。在用戶變量里面把tesseract安裝目錄添加進入path里面,在系統變量添加一個變量名為TESSDATA_PREFIX,變量值為字庫存放目錄的環境變量
QQ截圖20200611115112.png (79.94 KB, 下載次數: 0)
2020-6-11 11:51 上傳
QQ截圖20200611115242.png (17.87 KB, 下載次數: 0)
2020-6-11 11:53 上傳
接下來驗證是否安裝成功了里面輸入 tesseract -v,如下圖就是安裝成功了
QQ截圖20200610132700.png (22.15 KB, 下載次數: 0)
2020-6-11 11:54 上傳
二.測試
找到所有的圖片使用正則,我要把所有的標簽和對應的字符做成一個python字典,后面就好替換
我這里只提供一個測試的例子
[Python] 純文本查看 復制代碼def ocrs(names):
im = cv2.imread(names)
config = ("-l chi_sim --oem 0 --psm 10") #這些參數要做出說明的
datas = pytesseract.image_to_string(im, config=config) #調用pytesseract識別,
if datas: #判斷有沒有識別結果
c_datas = easygui.ccbox(msg='識別結果是' + datas, title=' ', choices=('True', 'false'),
image=names) #easygui一個詢問框,人工確認是否識別正確
if not c_datas:
#如果識別不正確,enterbox人工輸入,收集最終結果
datas = easygui.enterbox(msg="請輸入正確的字:", title=' ', default=' ', strip=True,
image=names, root=None)
else:
# 如果pytesseract識別結果為空,enterbox人工輸入,收集最終結果
datas = easygui.enterbox(msg="請輸入正確的字:", title=' ', default=' ', strip=True,
image=names, root=None)
#返回最終結果。最壞的結果就是人工也沒有輸入
return datas
def img_to_string():
paths = "**********" #填寫一個文本的路徑,讀取本文的信息,這里面有很多的標簽
datas = open(paths, encoding='utf-8')
pattern = re.compile("") #找到所有img的正則
str2 = pattern.findall(datas) #找到所有的img標簽
for i in str2:
#現在有很多的img的標簽被匹配出來了
pattern = re.compile("/.*?\\.png") #正則找到其中的鏈接,圖片文件格式都是png格式
str3 = pattern.findall(i) #正則找到其中的鏈接
urls = "*********"+str3[0] #*號是這個目標站點的域名,拼裝起來,下面requests保存圖片
if urls not in font_list : #為了防止同一個圖片下載很多遍,過濾一下
font_list.append(urls) #沒有就保存在數組里面,給上面判斷
names = str3[0][17:-4] #提取圖片的名稱,保存文件的地方用
datass = requests.get(urls,verify=False) #下載圖片
print(urls)
with open('./verify/' + str(names) + '.png', 'wb') as file:
file.write(datass.content) #保存圖片的二進制的數據
result = ocrs('./verify/' + str(names) + '.png') #把文件腳本專門的識別函數識別,返回實際的識別的文字
if result:
print(result)
font_dict[i]=result #有結果就加入字典保存
else:
#人工也沒有輸入的結果
print("null")
font_dict[i] = "null"
效果圖字庫標記少,幾十個文件公用20多個字,可以這樣弄,先一一把對應關系找出來,在進行替換,下面的替換我就不講了,寫的比較垃圾,哈哈,不獻丑了。下圖就是效果,所有識別過都會記錄到字典:
trains.gif (458.81 KB, 下載次數: 0)
2020-6-11 12:57 上傳
補充:
pytesseract調用的時候參數說明,這些參數我調了很久都沒有準確的,完美的,后面只好做彈窗確認,我們的圖片很小,只有一個字符。
--psm 10 這就是把整個圖當一個字符來識別
--oem 0 舊的引擎,一共有四種,都試了,這種比較準
把參數列給大家看下
[Asm] 純文本查看 復制代碼OCR選項:
--tessdata dir PATH指定tessdata PATH的位置。
--用戶字路徑指定用戶字文件的位置。
--用戶模式路徑指定用戶模式文件的位置。
--dpi值指定輸入圖像的dpi。
-l LANG[+LANG]指定用于OCR的語言。
-c VAR=配置變量的值設置值。
允許多個-c參數。
--psm NUM指定頁面分段模式。
--oem NUM指定OCR引擎模式。
注意:這些選項必須在任何配置文件之前出現。
頁面分割模式:
僅限0方向和腳本檢測(OSD)。
1個帶有OSD的自動頁面分割。
2自動頁面分割,但沒有OSD或OCR。(未實施)
3全自動頁面分割,但沒有OSD。(默認)
4假設一列大小可變的文本。
5假設一個垂直對齊的文本塊。
6假設一個統一的文本塊。
7將圖像視為單個文本行。
8將圖像視為一個單詞。
9將圖像視為一個圓圈中的單個單詞。
10將圖像視為單個字符。
11稀疏文本。找盡可能多的文本沒有特別的順序。
12帶OSD的稀疏文本。
13原始生產線。將圖像視為單個文本行,
繞過特定于Tesseract的攻擊。
OCR引擎模式:
僅限0舊版引擎。
僅限1臺神經網絡LSTM發動機。
2個傳統+LSTM引擎。
3默認,基于可用的內容。
相關附件
鏈接:https://pan.baidu.com/s/13Ry_cDnbteIUHMr_33oi4w
提取碼:fxfl
三.總結
Tesseract還是很方便的,還可以做一些其他的簡單的驗證碼識別,網上也有很多的例子。一開始弄了半天,因為參數的問題,一直沒有返回值,本來是想接入騰訊或者百度的第三方接口來識別的,結果發現并沒有多少字。最后來在使用過程中加了一個群,里面還是有很多的其他用法,還可以用Tesseract訓練出自己的字庫,又漲見識了。
總結
以上是生活随笔為你收集整理的php 图片路径混淆,爬虫遇到了字符图片混淆。pytesseract识别图片字符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php可以集成萤石监控吗,萤石多功能IP
- 下一篇: pythondjango搭建数据管理平台