爬虫验证码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫验证码相关的知识,希望对你有一定的参考价值。

我现在使用 phantomJS 截图,然后裁剪得到验证码,再通过Python光学识别获取验证码。

这个过程中遇到 phantomJS 截图大小不一致的问题,我本地的和服务器的图片,验证码的位置不一致。没办法,只好把服务器上的图片 scp 下来,然后更改像素位置。

为什么不直接下载图片下来呢?

每次点击图片,图片都会变化。应该是要将 cookie 和验证码一起提交上去。要验证这个观点,我决定使用 Charles 抓包看这些请求的顺序,并更改 cookie 看下有什么变化。验证码的思路是不是这样的:

给定一个 Cookie: JSESSIONID=031BC3B941D43115B95924C504662637; 然后每次请求验证码,将这个 cookie 与验证码对应起来,如果多次请求,那么验证码以最近的为准,即新验证码会覆盖旧验证码。

 有一个网站验证码地址是这样的,刚打开登录页,验证码地址是

/traffic_web/kaptcha.jpg

重发请求 `/traffic_web/kaptcha.jpg`,验证码图片一直会变。应该是后端随机选择一张图片,然后与 cookie 绑定,再返回给客户端。这样的图片我们要怎么下载呢?应该是以当前的 cookie 访问  `/traffic_web/kaptcha.jpg` 并下载图片,再登录,整个过程中 cookie 应该是同一个

因为一开始图方便就是用了 PhantomJS,大开大合。那现在这种情况要怎么处理呢?使用 session_request,cookie 从 phantomjs 中读取。我做的就是把截图变为下载图片,减少不稳定性。

试了一下,成功登陆。下面是我的代码:

import requests
import shutil


headers = {‘Cookie‘: ‘gsScrollPos=; JSESSIONID=54BE9AF60A0F98B10C0D10F195EAA4F3‘}
# 你们拿别的 url 去试一下,我这个是工作中用到的,不方便公开
url="http://url_to_kaptcha.jpg"

def f():
  # 储存图片到本地 来源 http://stackoverflow.com/questions/13137817/how-to-download-image-using-requests response = session_request.get(url, headers=headers, stream=True) with open(‘img.png‘, ‘wb‘) as out_file: shutil.copyfileobj(response.raw, out_file) del response

f()

  

还可以扩展的是

  1. 使用 GitHub 上别人做好的识别验证码的库,对图片做修建。
  2. 抓取大量验证码图片,使用机器学习提高识别率

我现在因为可以让对方不封 IP,所以也没动力去提高验证码识别率,使用Python的OCR,不做任何配置,只在 Python 代码中检验识别后的验证码去除空格的位数是否合适,一般最多识别10次就能成功登陆。

以上是关于爬虫验证码的主要内容,如果未能解决你的问题,请参考以下文章

爬虫日记-验证码识别

纯代码系列:Python实现验证码图片(PIL库经典用法用法,爬虫12306思路)

python网络爬虫之如何识别验证码

第二十三节:scrapy爬虫识别验证码图片验证码识别

3-爬虫-模拟登录图片验证码处理

Python爬虫之网站验证码识别