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未被正确训练以正确处理图像。
非常感谢您的帮助。 **此代码来自网络抓书,此示例的目的也是阅读验证码并提交表格。这绝不是使站点过载或损害站点的攻击或攻击工具。
答案 0 :(得分:1)
我用tesseract用nodejs解决了验证码。要使其运行,您需要先进行一些图像处理(取决于您尝试解决的验证码)。
如果您以这种验证码为例,我这样做了:
您可以在此处查看代码,如何完成代码以及更多文档: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
则更强大,更友好且免费。