爬虫验证码

我现在使用 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

# 你们拿别的 url 去试一下,我这个是工作中用到的,不方便公开
url="http://url_to_kaptcha.jpg"
def download_img(url, img_name, cookie_value, referer):
"""
:param url: 图片 url
:param img_name: 保存的图片名字 包括文件后缀 :eg: a.jpg
:param cookie_value:
:param referer: 头部,一般是登录页
:return:
"""
headers = {'Accept-Encoding': 'gzip, deflate, sdch',
'Accept-Language': 'zh-CN,zh;q=0.8,en;q=0.6',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36',
'Accept': 'image/webp,image/*,*/*;q=0.8',
'Referer': referer,
'Cookie': cookie_value}
session_request = requests.session()
response = session_request.get(url, headers=headers, stream=True)

if response.status_code == 200:
with open(img_name, 'wb') as out_file:
shutil.copyfileobj(response.raw, out_file)
del response
else:
del response
raise Exception('unknown error, can\'t find image')

  

还可以扩展的是

  1. 使用 GitHub 上别人做好的识别验证码的库,对图片做修建。  https://github.com/00nanhai/captchacker2
    1. 那些对图片预处理的算法有没有封装好可以直接调用的?
      1. 这下面看着名词都很吓人啊!

        de_noise去噪
        color_filter颜色过滤
        edge_detection边缘检测
        floodfill油漆桶
        dynamic_programing动态规划
        Erosion腐蚀
        Dilation膨胀
        Pixels_projection像素投影(垂直和斜切)
        svm支持向量机
        干扰线检测(深度优先搜索和最短路径算法)

    2. 什么情况用什么预处理算法?
  2. 抓取大量验证码图片,使用机器学习提高识别率
    1.   什么情况下要上机器学习?

搜索了一下,没找到很系统的预处理+机器学习破解验证码的资料。现在机器学习不是很火吗?怎么找不相关的系统的资料?

 

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

 实践:

根据这篇文章:http://www.jianshu.com/p/41127bf90ca9

在 `4邻域像素算法` 遇到问题,不知道 `对于像素值>245的邻域像素,判别为属于背景色,` 这个结论是怎么来的。我根据我的验证码处理情况,调小了这个数值,使不能识别,变成了 1/10 的识别率,对于我来说就够用了。我感觉这个 `245` 是灰度值,然后查了40分钟,怎样用 PS 来查看一个区域的灰度,没有实现。PS,excel 这样的东西,我认为就需要视频教学+重复练习,临时来搜索,很花时间。

欠缺:如果要提高成功率,还是要找系统的资料来看。

参考:

验证码识别的概念与处理流程

简单带干扰线验证码处理方法

转载于:https://www.cnblogs.com/jay54520/p/6218610.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值