爬虫验证码
我现在使用 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')
还可以扩展的是
- 使用 GitHub 上别人做好的识别验证码的库,对图片做修建。 https://github.com/00nanhai/captchacker2
- 那些对图片预处理的算法有没有封装好可以直接调用的?
- 这下面看着名词都很吓人啊!
de_noise去噪
color_filter颜色过滤
edge_detection边缘检测
floodfill油漆桶
dynamic_programing动态规划
Erosion腐蚀
Dilation膨胀
Pixels_projection像素投影(垂直和斜切)
svm支持向量机
干扰线检测(深度优先搜索和最短路径算法)
- 这下面看着名词都很吓人啊!
- 什么情况用什么预处理算法?
- 那些对图片预处理的算法有没有封装好可以直接调用的?
- 抓取大量验证码图片,使用机器学习提高识别率
- 什么情况下要上机器学习?
搜索了一下,没找到很系统的预处理+机器学习破解验证码的资料。现在机器学习不是很火吗?怎么找不相关的系统的资料?
我现在因为可以让对方不封 IP,所以也没动力去提高验证码识别率,使用Python的OCR,不做任何配置,只在 Python 代码中检验识别后的验证码去除空格的位数是否合适,一般最多识别10次就能成功登陆。
实践:
根据这篇文章:http://www.jianshu.com/p/41127bf90ca9
在 `4邻域像素算法` 遇到问题,不知道 `对于像素值>245的邻域像素,判别为属于背景色,` 这个结论是怎么来的。我根据我的验证码处理情况,调小了这个数值,使不能识别,变成了 1/10 的识别率,对于我来说就够用了。我感觉这个 `245` 是灰度值,然后查了40分钟,怎样用 PS 来查看一个区域的灰度,没有实现。PS,excel 这样的东西,我认为就需要视频教学+重复练习,临时来搜索,很花时间。
欠缺:如果要提高成功率,还是要找系统的资料来看。
参考: