python处理验证码
❶ 如何利用python做简单的验证码识别
最近在折腾验证码识别。最终的脚本的识别率在92%左右,9000张验证码大概能识别出八千三四百张左右。好吧,其实是验证码太简单。下面就是要识别的验证码。
接下来对图片进行分割。遍历图片中所有像素点,计算每一列像素为0的点的个数(jd)。对于相邻两列,若其中一列jd=0,而另一列jd!=0,则可以认为这一列是验证码中字符边界,由此对验证码进行分割。这样分割能达到比较好的效果,分割后得到的字符图片几乎能与模板完全相同。
(Width,Height) = img2.size
pix2 = img2.load()
x0 = []
y0 = []for x in range(1,Width):
jd = 0
# print x
for y in range(1,Height): # print y
if pix2[x,y] == 0:
jd+=1
y0.append(jd) if jd > 0:
x0.append(x)#分别对各个字符边界进行判断,这里只举出一个 for a in range(1,Width): if (y0[a] != 0)&(y0[a+1] != 0):
sta1 = a+1
分割完成后,对于识别,目前有几种方法。可以遍历图片的每一个像素点,获取像素值,得到一个字符串,将该字符串与模板的字符串进行比较,计算汉明距离或者编辑距离(即两个字符串的差异度),可用Python-Levenshtein库来实现。
我采用的是比较特征向量来进行识别的。首先设定了4个竖直特征向量,分别计算第0、2、4、6列每一列像素值为0的点的个数,与模板进行比较,若小于阈值则认为该字符与模板相同。为了提高识别率,如果通过竖直特征向量未能识别成功,引入水平特征向量继续识别,原理与竖直特征向量相同。
另外,还可以通过局部特征进行识别。这对于加入了旋转干扰的验证码有很好效果。由于我写的脚本识别率已经达到了要求,所以并没有用到这个。
最后的结果是这样的:
最终在模板库只有25条的情况下,识别率在92%左右(总共测试了一万六千张验证码)。好吧,只能说验证码太简单。。
以上。
❷ python如何识别验证码
我们首先识别最简单的一种验证码,即图形验证码。这种验证码最早出现,现在也很常见,一般由4位字母或者数字组成。例如,中国知网的注册页面有类似的验证码,页面如下所示:
表单中最后一项就是图形验证码,我们必须完全正确输入图中的字符才可以完成注册。
更多有关验证码的知识,可以参考这些文章:
Python3爬虫进阶:识别图形验证码
Python3爬虫进阶:识别极验滑动验证码
Python3爬虫进阶:识别点触点选验证码
Python3爬虫进阶:识别微博宫格验证码
·本节目标以知网的验证码为例,讲解利用OCR技术识别图形验证码的方法。
·准备工作识别图形验证码需要库tesserocr,以mac安装为例:在mac下,我们首先使用Homebrew安装ImageMagick和tesseract库: brew install imagemagickbrew install tesseract 接下来再安装tesserocr即可:pip3 install tesserocr pillow这样我们就完成了 tesserocr的安装。
·获取验证码为了便于实验,我们先将验证码的图片保存到本地。打开开发者工具,找到验证码元素。验证码元素是一张图片,它的ser属 性是CheckCode.aspk。所以我们直接打开如下链接就可以看到一个验证码,右键保存即可,将其命名为code.jpg:
这样我们就得到一张验证码图片,以供测试识别使用。
相关推荐:《Python教程》
识别测试
接下来新建一个项目,将验证码图片放到项目根目录下,用tesserocr库识别该验证码,代码如下所示:
这里我们新建了一个Image对戏那个,调用了tesserocr的image_to_text( )方法。传入该Image对象即可完成识别,实现过程非常简单,结果如下:
我们可以看到,识别的结果和实际结果有偏差,这是因为验证码内的多余线条干扰了图片的识别。
另外,tesserocr还有一个更加简单的方法,这个方法可以直接将图片文件转为字符串,代码如下:
不过这种方法的识别效果不如上一种的好。
验证码处理
对于上面的图片,我们可以看到其实并没有完全识别正确,所以我们需要对图像作进一步的处理,如灰度转换、二值化等操作。
我们可以利用Image对象的convert( )方法参数传入L,即可将图片转化为灰度图像,代码如下:
传入1即可将图片进行二值化处理,如下所示:
我们还可以指定二值化的阈值。上面的方法采用的是默认阈值127。不过我们不能直接转化原图,要将原图先转化为灰度图像,然后再指定二值化阈值,代码如下:
在这里,变量threshold代表二值化阈值,阈值设置为160,之后我们来看看我们的结果:
我们可以看到现在的二维码就比较方便我们进行识别了;那么对于一些有干扰的图片,我们做一些灰度和二值化处理,这会提高图片识别的正确率。
❸ 使用python来写脚本,如何来处理验证码的问题,每次登录时验证码都不同,求高人帮忙,谢谢
如果是想让代码识别的话,要看验证码的复杂程度了,如果比较简回单,使用图像处理说不定可答以解决(我不会,不过网上应该有资料,就算没有python的,其他语言的也有),但是如果是复杂的,建议你把验证码下载下来,如果有图形界面,就在界面中显示,如果没有,就下到一个目录里,自己取找,然后人工识别吧。
❹ python 如果抓取验证码图片 类似12306的登录验证码图片
这个以来前做过多次。最大的麻烦是源验证码的识别算法的识别率太低。比如12306那种网站你登陆错3次就限制你20分钟。所以除非你有33%以上的识别率否则不要尝试了。
通常做法是另存验证码图片,通常收集几十个,然后训练自己的识别算法。我曾经用PIL库自己做过识别算法,最高只有10%的识别率。效率还可以,一秒可以识别10次左右。主要是图片很小,所以处理起来也快。
验证码识别还有多少公开的算法,只能用来参考。不过真正识别都需要自己根据实际情况去训练改进算法。
❺ 用python破解带验证码密码
这个验证码的确简单,不过用tesseract ocr效果不太好。还不如自己用PIL开发一个类似的算法更准确。
用户名与密码要用字典,完全暴力破解是一个天文数字。不可行。不考虑封IP的前提下。你将常用的用户名都列出来。再找一个常用的密码字典做排列组合。
不过网站建设成这个样子,看来技术含量不高。也许它有其它的漏洞。不需要你去暴力破解。
❻ python处理滑动验证码,除了调用chrome
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import PIL.Image as image
import time,re, random
import requests
try:
from StringIO import StringIO
except ImportError:
from io import StringIO
#爬虫模拟的浏览器头部信息
agent = 'Mozilla/5.0 (Windows NT 5.1; rv:33.0) Gecko/20100101 Firefox/33.0'
headers = {
'User-Agent': agent
}
# 根据位置对图片进行合并还原
# filename:图片
# location_list:图片位置
#内部两个图片处理函数的介绍
#crop函数带的参数为(起始点的横坐标,起始点的纵坐标,宽度,高度)
#paste函数的参数为(需要修改的图片,粘贴的起始点的横坐标,粘贴的起始点的纵坐标)
def get_merge_image(filename,location_list):
#打开图片文件
im = image.open(filename)
#创建新的图片,大小为260*116
new_im = image.new('RGB', (260,116))
im_list_upper=[]
im_list_down=[]
# 拷贝图片
for location in location_list:
#上面的图片
if location['y']==-58:
im_list_upper.append(im.crop((abs(location['x']),58,abs(location['x'])+10,166)))
#下面的图片
if location['y']==0:
im_list_down.append(im.crop((abs(location['x']),0,abs(location['x'])+10,58)))
new_im = image.new('RGB', (260,116))
x_offset = 0
#黏贴图片
for im in im_list_upper:
new_im.paste(im, (x_offset,0))
x_offset += im.size[0]
x_offset = 0
for im in im_list_down:
new_im.paste(im, (x_offset,58))
x_offset += im.size[0]
return new_im
#下载并还原图片
# driver:webdriver
# div:图片的div
def get_image(driver,div):
#找到图片所在的div
background_images=driver.find_elements_by_xpath(div)
location_list=[]
imageurl=''
#图片是被CSS按照位移的方式打乱的,我们需要找出这些位移,为后续还原做好准备
for background_image in background_images:
location={}
#在html里面解析出小图片的url地址,还有长高的数值
location['x']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][1])
location['y']=int(re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][2])
imageurl=re.findall("background-image: url\(\"(.*)\"\); background-position: (.*)px (.*)px;",background_image.get_attribute('style'))[0][0]
location_list.append(location)
#替换图片的后缀,获得图片的URL
imageurl=imageurl.replace("webp","jpg")
#获得图片的名字
imageName = imageurl.split('/')[-1]
#获得图片
session = requests.session()
r = session.get(imageurl, headers = headers, verify = False)
#下载图片
with open(imageName, 'wb') as f:
f.write(r.content)
f.close()
#重新合并还原图片
image=get_merge_image(imageName, location_list)
return image
#对比RGB值
def is_similar(image1,image2,x,y):
pass
#获取指定位置的RGB值
pixel1=image1.getpixel((x,y))
pixel2=image2.getpixel((x,y))
for i in range(0,3):
# 如果相差超过50则就认为找到了缺口的位置
if abs(pixel1[i]-pixel2[i])>=50:
return False
return True
#计算缺口的位置
def get_diff_location(image1,image2):
i=0
# 两张原始图的大小都是相同的260*116
# 那就通过两个for循环依次对比每个像素点的RGB值
# 如果相差超过50则就认为找到了缺口的位置
for i in range(0,260):
for j in range(0,116):
if is_similar(image1,image2,i,j)==False:
return i
#根据缺口的位置模拟x轴移动的轨迹
def get_track(length):
pass
list=[]
#间隔通过随机范围函数来获得,每次移动一步或者两步
x=random.randint(1,3)
#生成轨迹并保存到list内
while length-x>=5:
list.append(x)
length=length-x
x=random.randint(1,3)
#最后五步都是一步步移动
for i in range(length):
list.append(1)
return list
#滑动验证码破解程序
def main():
#打开火狐浏览器
driver = webdriver.Firefox()
#用火狐浏览器打开网页
driver.get("htest.com/exp_embed")
#等待页面的上元素刷新出来
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']").is_displayed())
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_cut_bg gt_show']").is_displayed())
WebDriverWait(driver, 30).until(lambda the_driver: the_driver.find_element_by_xpath("//div[@class='gt_cut_fullbg gt_show']").is_displayed())
#下载图片
image1=get_image(driver, "//div[@class='gt_cut_bg gt_show']/div")
image2=get_image(driver, "//div[@class='gt_cut_fullbg gt_show']/div")
#计算缺口位置
loc=get_diff_location(image1, image2)
#生成x的移动轨迹点
track_list=get_track(loc)
#找到滑动的圆球
element=driver.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']")
location=element.location
#获得滑动圆球的高度
y=location['y']
#鼠标点击元素并按住不放
print ("第一步,点击元素")
ActionChains(driver).click_and_hold(on_element=element).perform()
time.sleep(0.15)
print ("第二步,拖动元素")
track_string = ""
for track in track_list:
#不能移动太快,否则会被认为是程序执行
track_string = track_string + "{%d,%d}," % (track, y - 445)
#xoffset=track+22:这里的移动位置的值是相对于滑动圆球左上角的相对值,而轨迹变量里的是圆球的中心点,所以要加上圆球长度的一半。
#yoffset=y-445:这里也是一样的。不过要注意的是不同的浏览器渲染出来的结果是不一样的,要保证最终的计算后的值是22,也就是圆球高度的一半
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=track+22, yoffset=y-445).perform()
#间隔时间也通过随机函数来获得,间隔不能太快,否则会被认为是程序执行
time.sleep(random.randint(10,50)/100)
print (track_string)
#xoffset=21,本质就是向后退一格。这里退了5格是因为圆球的位置和滑动条的左边缘有5格的距离
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
time.sleep(0.1)
ActionChains(driver).move_to_element_with_offset(to_element=element, xoffset=21, yoffset=y-445).perform()
print ("第三步,释放鼠标")
#释放鼠标
ActionChains(driver).release(on_element=element).perform()
time.sleep(3)
#点击验证
# submit = driver.find_element_by_xpath("//div[@class='gt_ajax_tip success']")
# print(submit.location)
# time.sleep(5)
#关闭浏览器,为了演示方便,暂时注释掉.
#driver.quit()
#主函数入口
if __name__ == '__main__':
pass
main()
❼ python爬虫遇到验证码怎么办
遇到验证码就需要破解验证码,绕过验证码
❽ python如何在短信中提取 验证码
如果格式统一的话,那就检测数据就行了,用个正则表达式,把短信里面的数据内容都提取出来
❾ Python如何抓去这个验证码图片然后解析输入有没有人告诉下
首先参考网址
网页链接
其次做这种OCR文字识别的需要自己训练模型才准确
❿ 如何利用Python 做验证码识别
用python加“验证码”为关键词在里搜一下,可以找到很多关于验证码识别的文章。我大体看了一下,主要方法有几类:一类是通过对图片进行处理,然后利用字库特征匹配的方法,一类是图片处理后建立字符对应字典,还有一类是直接利用ocr模块进行识别。不管是用什么方法,都需要首先对图片进行处理,于是试着对下面的验证码进行分析。
一、图片处理
这个验证码中主要的影响因素是中间的曲线,首先考虑去掉图片中的曲线。考虑了两种算法:
第一种是首先取到曲线头的位置,即x=0时,黑点的位置。然后向后移动x的取值,观察每个x下黑点的位置,判断前后两个相邻黑点之间的距离,如果距离在一定范围内,可以基本判断该点是曲线上的点,最后将曲线上的点全部绘成白色。试了一下这种方法,结果得到的图片效果很一般,曲线不能完全去除,而且容量将字符的线条去除。
第二种考虑用单位面积内点的密度来进行计算。于是首先计算单位面积内点的个数,将单位面积内点个数少于某一指定数的面积去除,剩余的部分基本上就是验证码字符的部分。本例中,为了便于操作,取了5*5做为单位范围,并调整单位面积内点的标准密度为11。处理后的效果:
二、字符验证
这里我使用的方法是利用pytesser进行ocr识别,但由于这类验证码字符的不规则性,使得验证结果的准确性并不是很高。具体哪位大牛,有什么好的办法,希望能给指点一下。
三、准备工作与代码实例
1、PIL、pytesser、tesseract
(1)安装PIL:下载地址:http:// www. pythonware. com/procts/pil/(2)pytesser:下载地址:http :/ /code. google. com/p/pytesser/,下载解压后直接放在代码相同的文件夹下,即可使用。
(3)Tesseract OCR engine下载:http: / / code.google. com/p/tesseract-ocr/,下载后解压,找到tessdata文件夹,用其替换掉pytesser解压后的tessdata文件夹即可。
2、具体代码
复制代码
#encoding=utf-8
###利用点的密度计算
import Image,ImageEnhance,ImageFilter,ImageDrawimport sys
from pytesser import *
#计算范围内点的个数
def numpoint(im):
w,h = im.size
data = list( im.getdata() )
mumpoint=0
for x in range(w):
for y in range(h):
if data[ y*w + x ] !=255:#255是白色
mumpoint+=1
return mumpoint
#计算5*5范围内点的密度
def pointmi(im):
w,h = im.size
p=[]
for y in range(0,h,5):
for x in range(0,w,5):
box = (x,y, x+5,y+5)
im1=im.crop(box)
a=numpoint(im1)
if a<11:##如果5*5范围内小于11个点,那么将该部分全部换为白色。
for i in range(x,x+5):
for j in range(y,y+5):
im.putpixel((i,j), 255)
im.save(r'img.jpg')
def ocrend():##识别
image_name = "img.jpg"
im = Image.open(image_name)
im = im.filter(ImageFilter.MedianFilter())enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
im.save("1.tif")
print image_file_to_string('1.tif')
if __name__=='__main__':
image_name = "1.png"
im = Image.open(image_name)
im = im.filter(ImageFilter.DETAIL)
im = im.filter(ImageFilter.MedianFilter())enhancer = ImageEnhance.Contrast(im)
im = enhancer.enhance(2)
im = im.convert('1')
##a=remove_point(im)
pointmi(im)
ocrend()