前言我破解的登录验证码类型是一个数学公式,也就是...是不是看起来比较简单,但是Tesseract对这种图片的识别率也是很低的。后期如果想提高识别率,我觉得第一是图片降噪锐化,第二是预训练Tesseract。我推荐jTessBoxEditor作为培训工具。如果你有兴趣,你可以了解一下。1安装Tesseract1.1下载Tesseract。地址为:用MinGW-w64制作的WindowsInstaller,下载后直接安装即可,安装完成后配置环境变量。编辑系统变量中的路径,添加如下环境变量。C:\ProgramFiles(x86)\Tesseract-OCR安装完成后,在cmd命令行窗口输入:tesseract-v出现以下内容证明安装成功。1.2安装pytesseractpipinstallpytesseract2识别码2.1识别逻辑。先用selenium在浏览器中找到验证码标签,然后保存截图,再用tesseract识别图片。如果识别失败,使用selenium点击验证码图片重新生成一个验证码,然后重复前面的识别逻辑。如果识别成功,使用eval计算公式的值,填入后点击登录按钮。2.2代码导入timeimportpytesseractfromselenium.webdriverimportChromefromPILimportImagedriver=Chrome(executable_path=r'D:\ChromeDownloads\chromedriver.exe')#chromedriver存放路径url="http://60.210.111.130:8002/Login.aspx"print("开始爬取,url为{}".format(url))driver.get(url=url)time.sleep(2)#找到username的input标签,填写用户名username=driver.find_element_by_id('txtUserName')username.clear()username.send_keys('yourusername')#找到password的输入标签,填写密码。如果再次点击验证码时密码被清除,那么这段代码应该放在while循环里面timestimes=0whileTrue:try:element=driver.find_element_by_id('validimg')element.click()#每个请求的验证码图片都不一样,只能截图保存在本地。driver.save_screenshot('validImage.png')#windows系统要注意页面缩放比例。如果是150%,那么每一项都是*1.5。Linux系统不需要left=element.location['x']*1.5top=element.location['y']*1.5right=element.location['x']*1.5+element.size['width']*1.5bottom=element.location['y']*1.5+element.size['height']*1.5im=Image.open('validImage.png')im=im.crop((left,top,right,bottom))#cutoutim.save('validImage.png')data=pytesseract.image_to_string(Image.open('validImage.png'))iflen(data)<3:#无法识别继续iflen(data)==4:#识别为=符号,移除=符号data=data[:3]ifdata[1]==".":#-符号通常不被识别为.,替换为-符号data[1]="-"print("ocr识别结果",data)valid_code=driver.find_element_by_id('validcode')valid_code.clear()valid_code.send_keys(eval(data))time.sleep(1)btnLogin=driver.find_element_by_id('btnLogin')btnLogin.click()#获取cookielogin_cookie=driver.get_cookie('ASP.NET_SessionId')total_cookie='ASP.NET_SessionId={};自动登录=空;用户=空;pwd=null'.format(login_cookie['value'])print("total_cookie,{}".format(total_cookie))breakexceptExceptionase:time.sleep(2)times+=1print("破解验证码failed,retry{}times".format(times))iftimes==20:raiseRuntimeError#Linux系统要注意退出chromedriver否则如果执行多次会产生大量的chromedriver进程。driver.quit()的执行结果如下:坑之一是windows系统显示缩放比例。在桌面右键-显示设置-缩放和布局中可以看到。如果缩放比例为150%,那么在截图部分,每个参数必须为*1.5,否则无法截取想要的验证码。