python实现QQ登陆验证码数据采集

         在很多网站应用中为了防止爬虫或者是一些恶意数据获取行为的发生都会加入验证码这一防范机制,有静态验证码也有动态验证码,有纯数字验证码也有数字字母混合验证码,还有滑动验证码,简直是五花八门的存在。

        当然了,正所谓,道高一尺魔高一丈,一系列验证码破解项目诞生了,当然大多数的验证码破解项目都是图像数据处理技术与机器学习或者是深度学习相结合形成的,我们今天先不去扯那么远了,想要做一个验证码识别的项目首先就是要获取到待识别的验证码数据,今天就是先来进行数据的获取。

       本文的目标站点选择了我们都很熟悉的腾讯QQ登陆的验证码数据,获取方式很简单,具体实现如下:
 

#!usr/bin/env python
#encoding:utf-8
from __future__ import division


'''
__Author__:沂水寒城
功能: 网络验证码数据采集模块
'''


import os
import sys
import time
import json
import random
import urllib2
import datetime
import requests
import pandas as pd
from PIL import Image
from selenium import webdriver
from multiprocessing import Process
from fake_useragent import UserAgent



reload(sys)
sys.setdefaultencoding('utf-8')
ip_list=json.load(open('valid_ip_all.json'))  #代理IP池



def generateRandomUA(num=100):
    '''
    生成随机的 User-Agent 字符串(使用第三方海量ua库)
    '''
    agent_list=[]
    user_agent=UserAgent()
    for i in range(num):
        one_agent=user_agent.random
        agent_list.append(one_agent)
    return agent_list



def getPageHtml(url,header,proxy,num_retries=3):
    '''
    多代理形式、超时重试机制,获取数据
    '''
    try:
        response=requests.get(url,headers=header,proxies=proxy,timeout=5)
        return response
    except Exception,e:
         time.sleep(random.randint(3,8))
         while num_retries:
            num_retries-=1
            print('Left tring number is:  ', num_retries)
            return getPageHtml(url,header,proxy,num_retries)


def getVCPics(img_url,start,end,saveDir):
    '''
    下载验证码数据
    '''
    if not os.path.exists(saveDir):
        os.makedirs(saveDir)
    for i in range(start,end):
        print("Downloading",i+1,"......")
        header,proxy=buildProxy()
        try:
            img=getPageHtml(img_url,header,proxy,num_retries=3)
            pic_name=saveDir+str(i+1)+'.jpg'
            file_pic=open(pic_name,'ab')
            file_pic.write(img.content)
            file_pic.close()
            time.sleep(random.randint(1,4))
        except:
            pass


if __name__ == '__main__':
    print('captchaDataCollection!!!')
    url="http://captcha.qq.com/getimage?aid=1007901&r=0.38687027756482356"
    #验证码数据采集
    getVCPics(url,0,200,'QQ/')

       上述代码中,我们加入了高可用IP代理措施,来避免由于频繁爬取造成的IP被封或者限制的问题,具体的IP代理数据我已经在之前的文章中提及,也上传到了我的资源目录里面,需要的话可以直接拿去使用,效用还是可以的。

         getPageHtml(url,header,proxy,num_retries=3)是我们用于采集验证码数据集,考虑到可能出现的IP失效或者是网络请求出错等其他的问题设置的页面超时重传机制,num_retries表示的是默认的超时重传次数,比如:这里在第一次数据请求失败后会休眠随机的时间之后,重新进行请求,直到尝试到最大的重传次数才放弃当次的数据获取工作。这也算是网络数据采集中的一点容错机制吧,毕竟不是每一次网络请求都是正常进行的,总会有一些意外的问题产生,这也是以往数据采集过程中遇上的问题,所以就在这里加入了这样的容错机制。

       我们暂时获取了200张图像数据,我在每次获取后都加入了一个随机休眠时间,做人要厚道不是嘛,别把人家网站搞得太累了呀是不是。数据的下载还是很快的,每一个验证码数据的下载本质上就是执行了一次get操作,然后将网站的响应结果保存本地就行了,速度还是很快的,但是不要为了过快的速度去设置很小的时间间隔,这样对人家网站正常的负载影响还是会挺大的,毕竟只是为了练习技术的,没必要不太道德。此外,本文只是出于研究的目的来进行的实验工作,不要用于其他的用途,造成不必要的麻烦,几百张的数据量对于我们简单的研究和分析来说肯定是足够了,如果后面需要做深度学习模型来进行验证码的识别的话就需要考虑使用小批量数据来进行数据增强处理,而不是一味地盲目去大批量进行数据采集。

        程序运行输出截图如下:

python实现QQ登陆验证码数据采集_第1张图片

      采集到的图像数据截图如下:
 

python实现QQ登陆验证码数据采集_第2张图片

        从上面的结果整体来看:基于QQ验证码数据的完全识别难度还是比较大的。首先:这里原始字符数据的倾向、形变、叠压程度还是比较大的,而且验证码都是RGB图像,且还是空心图像,这样经过灰度化处理之后就连人都不好去识别了,毕竟验证码的本质目的就是【让人很容易识别出来,让机器很难识别出来】,可以说:QQ验证码很好地实现了这个目标。其次,原始图像数据中不同字符的位置,间距极不规律,在一般的验证码识别工作中,往往要对原始的验证码数据进行切割处理,最终的识别是基于单个字符进行的,但是由于位置、倾斜、间距等因素的存在,导致了字符切割难度的增大,这些都给验证码的识别工作带来的影响。

        不过,验证码识别不是今天本文的研究内容,之后有时间的话再去看看怎么才能更好地识别出来验证码数据吧,今天的实践内筒到这里就先暂时告一段落了!记录一下!

你可能感兴趣的:(编程技术)