Infi-chu:

http://www.cnblogs.com/Infi-chu/

一、图形验证码识别
1.使用tesserocr

import tesserocr
from PIL import Image

# 在本地存储一张验证码的图片做测试
image = Image.open('test.jpg')
result = tesserocr.image_to_text(image)
print(result)

# 直接将文本转为字符串
import tesserocr
print(tesserocr.file_to_text('test.jpg'))

2.处理验证码图片
convert()方法,可将图片转化为灰度图像、二值化图像

image = image.convert('L')	# 将图像转化为灰度图像
image.show()
image = image.convert('1') # 将图像转化为二值化图像,二值化阈值默认是127 # 现将图片转化成灰度图像,再转化成二值化图像
image = image.convert('L')
threshold = 80 # 设定阈值
table = []
for i in range(256):
if i < threshold:
table.append(0)
else:
table.append(1)
image = image.point(table,'1')
image.show() # 图像变得清晰
result = tesserocr.image_to_text(image)
print(result)

二、滑动验证码识别
滑动验证码就如同用一块拼图去在图片中填充
1.滑动验证码特点:
防模拟
防伪造
防暴力

2.如何识别:
采用浏览器模拟验证

3.初始化:

EMAIL = 'test@test.com'
PASSWORD = '123456' class CrackGeetest():
def __init__(self):
self.url = 'https://account.geetest.com/login'
self.browser = webdriver.Chome()
self.wait = WebDriverWait(self.browser,20)
self.email = EMAIL
self.pasword = PASSWORD

4.模拟点击:

# 寻找按钮
def get_geetest_button(self):
button = self.wait.until(EC.element_to_be_clickable((BY.CLASS_NAME,'geetest_radar_tip')))
return button
# 点击验证按钮
button = self.get_geetest_button()
button.click()

5.识别缺口:
首先对比原图和现图,利用selenium选取图片元素,得到位置和size,然后获取截图

#
# 获取位置和size
def position(self):
img = self.wait.until(EC.persence_of_element_located((By.CLASS_NAME,'geetest_canvas_img')))
time.sleep(2)
location = img.location
size = img.size
top,bottom,left,right = location['y'],location['y']+size['height'],location['x'],location['x']+size['width']
return (top,bottom,left,right)
# 获取网页截图
def get_geetest_image(self,name='captcha.png'):
top,bottom,left,right = self.get_position() # 获取图片的位置和宽高,随后返回左上角和右下角的坐标
print('验证码位置',top,bottom,left,right)
screenshot = self.get_screenshot() # 得到屏幕目标
captcha = screenshot.crop((left,top,right,bottom))
# 获取第二张图片(带有缺口的图片)
def get_slider(self):
slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'geetest_slider_button')))
return slider
# 点击后出现接口
slider = self.get_slider()
slider.click()
# 在调用 get_geetest_image()函数获取第二张图,分别命名为img1和img2
'''
对比图像的缺口,需要遍历图片的每一个坐标点,获取两张图片对应像素点的RGB数据,如果差距在一定范围内,则代表两个像素相同,接着继续对比下一个像素点。如果差距在一定范围之外,则说明不是相同的像素点,则该位置就是缺口位置
'''
def is_pixel_equal(self,img1,img2,x,y):
# 取两个图片的像素点
pixel1 = img1.load()[x,y]
pixel2 = img2.load()[x,y]
threshold = 60
# 两张图RGB的绝对值小于定义的阈值,则代表像素点相同,继续遍历。否则不相同,为缺口位置
if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold:
return True
else:
return False def get_gap(self,img1,img2):
left = 60
for i in range(left,img1.size[0]):
for j in range(img1.size[1]):
if not self.is_pixel_equal(img1.img2,i,j): # 判断两个图片的某一点的像素是否相同
left = i
return left
return left

6.模拟拖动:

def get_track():
track = []
current = 0
mid = distance * 4 / 5
t = 0.2
v = 0
while current < distance:
if current < mid:
a = 2
else:
a = -3
v0 = v
v = v0 + a * t
x = v0*t+1/2*a*t^2
move = v0*t+1/2*a*t^2
current += move
track.append(round(move))
return track def move_to_gap(self,slider,tracks):
ActionChains(self.browser).click_and_hold(slider).perform()
for x in tracks:
ActionChains(self.browser).move_by_offset(xoffset=x,yoffset=0).perform()
time.sleep(0.3)
ActionChains(self.browser).release().perform()

1.和12306的验证码类似
2.思路:
文字识别、图像识别
3.使用超级鹰平台识别
修改Python API

import requests
from hashlib import md5 class Chaojiying(obj):
def __init__(self,username,password,soft_id):
self.username=username
self.password=md5(password.encode('utf-8')).hexdigest()
self.soft_id=soft_id
self.base_params = {
'user':self.username,
'pass2':self.password,
'softid':self.soft_id,
}
self.headers = {
'Connection':'Keep-Alive',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'
}
def post_pic(self,im,codetype):
params = {
'codetype':codetype,
}
params.update(self.base_params)
files = {'userfile':('test.jpg',im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php',data=params,files=files,headers=self.headers)
return r.json()
def report_error(self,im_id):
params = {'id':im_id,}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php',data=params,headers=self.headers)
return r.json()

4.初始化:

EMAIL = 'test@test.com'
PASSWORD = ''
CHAOJIYING_USERNAME='test'
CHAOJIYING_PASSWORD=''
CHAOJIYING_SOFT_ID=893590 # 软件ID
CHAOJIYING_KIND=9102 # 验证码类型
class CrackTouClick():
def __init__(self):
self.url='输入要识别的网站'
self.browser=webdriver.Chome()
self.wait=WebDriverWait(self.browser,20)
self.email=EMAIL
self.password=PASSWORD
self.chaojiying=Chaojiying(CHAOJIYING_USERNAME,CHAOJIYING_PASSWORD,CHAOJIYING_SOFT_ID,CHAOJIYING_KIND)

5.获取验证码:

def open():
self.browser.get(self.url)
email=self.wait.until(EC.persence_of_element_located((By.ID,'email')))
password=self.wait.until(EC.persence_of_element_located((By.ID,'password')))
email.send_keys(self.password)
def get_touclick_button(self):
button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'touclick-hod-wrap')))
return button
def get_touclick_element(self):
element = self.wait.until(EC.persence_of_element_located((By.CLASS_NAME,'touclick-pub-content')))
return element
def get_position(self):
element=self.get_touclick_element()
time.sleep(1)
location=element.location
size=element.size
top,bottom,left,right=location['y'],location['y']+size['height'],location['x'],location['x']+size['width']
return (top,bottom,left,right)
def get_screenshot(self):
screenshot=self.browser.get_screenshot_as_png()
screenshot=Image.open(BytesIO(screenshot))
return screenshot
def get_touclick_image(self,name='captcha.png')
top,bottom,left,right=self.get_position()
print('验证码位置',top,bottom,left,right)
screenshot = self.get_screenshot()
captcha = screenshot.crop((left,top,right,bottom))
return captcha

6.识别验证码:

image = self.get_touclick_image()
bytes_array=BytesIO()
image.save(bytes_array,format='PNG')
res = self.chaojiying.post_pic(bytes_array,getvalue(),CHAOJIYING_KIND)
print(res)
def get_points(self,captcha_result):
groups=captcha_result.get('pic_str').split('|')
locations=[[int(number) for number in group.split(',')]for group in groups]
return locations
def touch_click_words(self,locations):
for location in locations:
print(location)
ActionChains(self.browser).move_to_element_with_offset(self.get_touclick_element(),location[0],location[1]).click().perform()
time.sleep(1)

Python3爬虫(十四) 验证码处理的更多相关文章

  1. python3笔记十四:python可变与不可变数据类型+深浅拷贝

    一:学习内容 python3中六种数据类型 python赋值 python浅拷贝 python深拷贝 二:python3六种数据类型 1.六种数据类型 Number(数字) string(字符串) L ...

  2. Python3爬虫(四)请求库的使用requests

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.基本用法: 1. 安装: pip install requests 2. 例子: import request ...

  3. 爬虫(十四):Scrapy框架(一) 初识Scrapy、第一个案例

    1. Scrapy框架 Scrapy功能非常强大,爬取效率高,相关扩展组件多,可配置和可扩展程度非常高,它几乎可以应对所有反爬网站,是目前Python中使用最广泛的爬虫框架. 1.1 Scrapy介绍 ...

  4. Python爬虫(十四)_BeautifulSoup4 解析器

    CSS选择器:BeautifulSoup4 和lxml一样,Beautiful Soup也是一个HTML/XML的解析器,主要的功能也是如何解析和提取HTML/XML数据. lxml只会局部遍历,而B ...

  5. python3 第十四章 - 数据类型之Dictionary(字典)

    在python中字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下 ...

  6. Python3学习十四

    1.  JS基本概念 网景和sun联合开发javascript javascript 三个部分:ECMAScript 语法    DOM(document object model)    BOM(b ...

  7. python3 第二十四章 - 函数式编程之Anonymous function(匿名函数)

    匿名函数指一类无须定义标识符的函数或子程序.Python用lambda语法定义匿名函数,只需用表达式而无需申明.lambda语法的定义如下: lambda [arg1 [,arg2, ... argN ...

  8. python3(十四) filter

    # 和map()类似,filter()也接收一个函数和一个序列. # 和map()不同的是,filter()把传入的函数依次作用于每个元素, # 然后根据返回值是True还是False决定保留还是丢弃 ...

  9. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  10. JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

    JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接 ...

随机推荐

  1. Windows下Redis集群配置

    Redis集群学习地址:http://blog.csdn.net/dc_726/article/details/11694437 Windows-32系统下搭建Redis集群 一.Redis主从同步原 ...

  2. 使用BAPISDORDER_GETDETAILEDLIST创建S/4HANA的Outbound Delivery

    要在S/4HANA里创建Outbound Delivery,首先要具有一个销售订单,ID为376,通过事务码VA03查看. 只用61行代码就能实现基于这个Sales Order去创建对应的outbou ...

  3. memcached 相关

    今天用了下memcached,把一个日志分析结果的大数组缓存起来,由于实时性跟准确性要求不高,所以缓存一周:因为日志越来越多,不缓存的话每次查看页面会比较慢.(其实可以先离线定期计算好结果存起来).以 ...

  4. Intellij IDEA快速补全System.out.print : sout

  5. 用python实现矩阵转置

    前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加.例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再 ...

  6. SOJ 1002/1003/1004 大整数相加/相乘/相除

    三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反 ...

  7. UVa 1636 - Headshot(概率)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. mxnet导入图像数据

    图像的标签在一个json文件中. %matplotlib inline import json import gluonbook as gb import mxnet as mx from mxnet ...

  9. C#处理List<object>重复数据的问题

    private class ListDistinct : IEqualityComparer<object> { public bool Equals(object x, object y ...

  10. Java中线程同步的理解

    我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源, ...