使用tesseract读取CAPTCHA给出错误的读数

时间:2018-12-28 21:52:24

标签: python python-2.7 python-tesseract

from urllib import urlopen,urlretrieve
from PIL import Image,ImageOps
from bs4 import BeautifulSoup
import requests
import subprocess
def cleanImage(imagePath):
    image=Image.open(imagePath)
    image=image.point(lambda x:0 if x<143 else 255)
    borederImage=ImageOps.expand(image,border=20,fill="white")
    borederImage.save(imagePath)
html=urlopen("http://www.pythonscraping.com/humans-only")
soup=BeautifulSoup(html,'html.parser')
imageLocation=soup.find('img',{'title':'Image CAPTCHA'})['src']
formBuildID=soup.find('input',{'name':'form_build_id'})['value']
captchaSID=soup.find('input',{'name':'captcha_sid'})['value']
captchaToken=soup.find('input',{'name':'captcha_token'})['value']
captchaURL="http://pythonscraping.com"+imageLocation
urlretrieve(captchaURL,"captcha.jpg")
cleanImage("captcha.jpg")
p=subprocess.Popen(['tesseract','captcha.jpg',"captcha"],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
p.wait()
f=open('captcha.txt','r')
captchaResponce=f.read().replace(" ","").replace("\n","")
print "captcha responce attempt "+ captchaResponce+"\n\n"
try:
    print captchaResponce
    print len(captchaResponce)
    print type(captchaResponce)
except:
    print "No way"

你好

这是我用于测试站点的代码,用于下载CAPTCHA映像(每次打开站点时,您将获得一个不同的CAPTCHA),然后使用python中的tesseract读取它。

我试图直接下载图像并使用tesseract直接读取图像,但没有获得正确的验证码,因此我添加了功能cleanImage来提供帮助,但也没有正确读取图像。 / p>

在线搜索之后,我的问题似乎出在tesseract未被正确训练以正确处理图像。

非常感谢您的帮助。 **此代码来自网络抓书,此示例的目的也是阅读验证码并提交表格。这绝不是使站点过载或损害站点的攻击或攻击工具。

2 个答案:

答案 0 :(得分:1)

我用tesseract用nodejs解决了验证码。要使其运行,您需要先进行一些图像处理(取决于您尝试解决的验证码)。

enter image description here

如果您以这种验证码为例,我这样做了:

  1. 消除“白噪声”
  2. 去除灰线
  3. 删除灰点
  4. 填补空白
  5. 更改为灰度图像
  6. 现在使用tesseract进行OCR

您可以在此处查看代码,如何完成代码以及更多文档:https://github.com/cracker0dks/CaptchaSolver

答案 1 :(得分:0)

Tesseract经过训练可以执行更多常规的OCR,CAPTCHA本身就具有很大的挑战性,因为字符未对齐,可能旋转,重叠并且大小和字体不同。您应尝试使用其他页面分段模式(tesseract选项)调用--psm。这是所有可能值的列表:

Page segmentation modes:
0    Orientation and script detection (OSD) only.
1    Automatic page segmentation with OSD.
2    Automatic page segmentation, but no OSD, or OCR.
3    Fully automatic page segmentation, but no OSD. (Default)
4    Assume a single column of text of variable sizes.
5    Assume a single uniform block of vertically aligned text.
6    Assume a single uniform block of text.
7    Treat the image as a single text line.
8    Treat the image as a single word.
9    Treat the image as a single word in a circle.
10   Treat the image as a single character.
11   Sparse text. Find as much text as possible in no particular order.
12   Sparse text with OSD.
13   Raw line. Treat the image as a single text line,
     bypassing hacks that are Tesseract-specific.

尝试OSD模式(例如1、7、11、12、13)。这将提高您的识别率。但是要真正改善,您将必须编写一个程序来查找单独的字母(对图像进行分段),然后将它们逐个发送到tesseract(使用--psm 10)。 opencv是用于图像处理的出色库。 This帖子可能是一个好的开始。

关于CAPTCHA认可的合法性的担忧:这是道德问题,超出了SO的范围。 Pythonscraping是一个经典的测试站点,我认为没有任何问题可以帮助解决问题。这种担心与教导自卫可能会袭击人是一样的。

无论如何,CAPTCHA是一个非常薄弱的​​人类确认挑战,如今没有站点可以使用它,而reCAPTCHA则更强大,更友好且免费。