当前位置:   article > 正文

python识别验证码_python怎样识别校验码

python怎样识别校验码

验证码是页面上非常常见的一种识别用户身份的方式,如图所示:

Image CAPTCHA

在使用爬虫爬取网页时,我们要对验证码进行自动的识别和填写。这里使用tesseract来完成对验证码的扫描识别。

1. 安装tesseract。

tesseract是一个独立的软件,并不是python模块,需要单独的下载并安装。

下载地址:https://github.com/UB-Mannheim/tesseract/wiki 选择适当的版本下载。

当前最新版本是64位的4.00版本。下载后双击安装即可。

安装完毕后要将tesseract.exe路径添加到环境变量中,在命令行窗口输入tesseract --version测试:

2. 我们的测试网站是http://www.pythonscraping.com/humans-only 打开网页后有一个需要用户提交的表格,在提交内容的下方有一个由网站生成的验证码:

 利用requests访问网站,利用BeautifulSoup提取填写表格时必须要的验证信息,利用pillow处理和保存图片。

  1. resp = requests.get('http://www.pythonscraping.com/humans-only')
  2. bsobj = BeautifulSoup(resp.text, features='html.parser')

表格中有很多防止CSRF的隐藏域,通过Chrome的开发者工具可以获得这些隐藏域的值。通过表单提交数据也必须提交这些隐藏域的信息作为CSRF_TOKEN,否则表单验证不会通过:

图中标红框的内容都是要提取的内容,三个隐藏input的value值是CSRF_TOKEN,img标签的src值是验证码图片的地址。

  1. imageURL = bsobj.find('img', {'title': 'Image CAPTCHA'})['src']
  2. formBuildID = bsobj.find('input', {'name': 'form_build_id'})['value']
  3. captchaSid = bsobj.find('input', {'name': 'captcha_sid'})['value']
  4. captchaToken = bsobj.find('input', {'name': 'captcha_token'})['value']

 3. 根据imageURL发起网络请求获得验证码图片。需要注意的是,src是一个相对路径,访问时要使用完整的路径:

  1. imgContent = requests.get('http://pythonscraping.com' + imageURL)
  2. image = Image.open(BytesIO(imgContent.content))
  3. filename = 'captcha.jpg'
  4. image.save(filename)

imgContent.content是图片的二进制格式,利用pillow的Image和io的BytesIO封装为一个pillow的Image对象,调用save方法将图片保存到指定路径。

4. 为了提高识别的准曲率,可以适当对图像进行处理。增加图像的对比度:

  1. img = Image.open(filename)
  2. img = img.point(lambda x: 0 if x < 143 else 255)
  3. borderImg = ImageOps.expand(img, 10, 'white')
  4. borderImg.save(filename)

尽量减少图像上的灰色内容,做到非黑即白。

5. 在python中开启一条进程,启动tesseract识别图片中的内容,并将识别结果输出到一个txt文件中保存:

  1. p = subprocess.Popen(['tesseract', 'captcha.jpg', 'captcha'],
  2. stdout=subprocess.PIPE,
  3. stderr=subprocess.PIPE)
  4. p.wait()

通过subprocess在当前py运行的进程中开启另外一个线程运行tesseract,并且当前线程暂停等待tesseract线程完成识别工作并将识别结果保存到captcha.txt中。

6. 打开captcha.txt,读取解析结果:

  1. with open('captcha.txt', 'r') as reader:
  2. catchacode = reader.read().replace(' ', '').replace('\n', '')
  3. print('验证码为:', catchacode)

对识别中产生的空格和换行都做了替换处理,最终打印识别的结果。

识别效果展示:

识别效果还可以,但并不是每次都可以正确识别的。为了提高tesseract的识别率,可以对tesseract进行训练。具体方式可以参考相关技术文档。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/593573
推荐阅读
相关标签
  

闽ICP备14008679号