1. python selenium 获取短信验证码是字符和数字怎么读取数字
读取短信需要在相应的手机上读取呀
由于工作需要,登录网站需要用到验证码。最初是研究过验证码识别的,但是总是不能获取到我需要的那个验证码。直到这周五,才想起这事来,昨天顺利的解决了。
下面正题:
Python版本:3.4.3
所需要的代码库:PIL,selenium,tesseract
先上代码:
#coding:utf-8
import subprocess
from PIL import Image
from PIL import ImageOps
from selenium import webdriver
import time,os,sys
def cleanImage(imagePath):
image = Image.open(imagePath) #打开图片
image = image.point(lambda x: 0 if x<143 else 255) #处理图片上的每个像素点,使图片上每个点“非黑即白”
borderImage = ImageOps.expand(image,border=20,fill='white')
borderImage.save(imagePath)
def getAuthCode(driver, url="http://localhost/"):
captchaUrl = url + "common/random"
driver.get(captchaUrl)
time.sleep(0.5)
driver.save_screenshot("captcha.jpg") #截屏,并保存图片
#urlretrieve(captchaUrl, "captcha.jpg")
time.sleep(0.5)
cleanImage("captcha.jpg")
p = subprocess.Popen(["tesseract", "captcha.jpg", "captcha"], stdout=\
subprocess.PIPE,stderr=subprocess.PIPE)
p.wait()
f = open("captcha.txt", "r")
#Clean any whitespace characters
captchaResponse = f.read().replace(" ", "").replace("\n", "")
print("Captcha solution attempt: " + captchaResponse)
if len(captchaResponse) == 4:
return captchaResponse
else:
return False
def withoutCookieLogin(url=""):
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)
while True:
authCode = getAuthCode(driver, url)
if authCode:
driver.back()
driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").clear()
driver.find_element_by_xpath("//input[@id='orgCode' and @name='orgCode']").send_keys("orgCode")
driver.find_element_by_xpath("//input[@id='account' and @name='username']").clear()
driver.find_element_by_xpath("//input[@id='account' and @name='username']").send_keys("username")
driver.find_element_by_xpath("//input[@type='password' and @name='password']").clear()
driver.find_element_by_xpath("//input[@type='password' and @name='password']").send_keys("password")
driver.find_element_by_xpath("//input[@type='text' and @name='authCode']").send_keys(authCode)
driver.find_element_by_xpath("//button[@type='submit']").click()
try:
time.sleep(3)
driver.find_element_by_xpath("//*[@id='side-menu']/li[2]/ul/li/a").click()
return driver
except:
print("authCode Error:", authCode)
driver.refresh()
return driver
driver = withoutCookieLogin("http://localhost/")
driver.get("http://localhost/enterprise/add/")
怎么获取我们需要的验证码
在这获取验证码的道路上,我掉了太多的坑,看过太多的文章,很多都是教你验证码的识别方法,但是没有说明,怎么获取你当前需要的验证码图片。
我的处理方法是:
1.先用selenium打开你需要的登录的页面地址url1
2.通过审核元素获取验证码的地址url2(其实最简单的是右键打开新页面)
3:在url1页面,输入地址url2进入url2页面,然后截屏保存验证码页面
4:处理验证码得到验证码字符串。然后点击浏览器后退按钮,返回url1登录页面
5:输入登录需要的信息和验证码
6:点击登录
7:验证登录后的页面,判断是否成功,若不成功则需要重新1-7的操作。
为了保护公司的信息,这个页面是我本地搭的服务,我在伯乐在线注册页面进行测试过这个验证码获得方法,可以通过。(这个验证码的处理方法,仅限验证码背景是像素点,若验证码有横线需额外处理。)
第一篇博文,不喜勿喷。
验证码处理方法参考文献:
Web Scraping with python.pdf
2. 使用Python进行验证码识别案例无法验证通过,SOS
是不是PIL需要的依赖图像支持没有下?
试试这个
sudo apt-get install zlib1g-dev
sudo apt-get install libfreetype6-dev
sudo apt-get build-dep python-imaging
能安装的都安上
3. python抓取网页时是如何处理验证码的
python抓取网页时是如何处理验证码的?下面给大家介绍几种方法:
1、输入式验证码
这种验证码主要是通过用户输入图片中的字母、数字、汉字等进行验证。如下图:
解决思路:这种是最简单的一种,只要识别出里面的内容,然后填入到输入框中即可。这种识别技术叫OCR,这里我们推荐使用Python的第三方库,tesserocr。对于没有什么背影影响的验证码如图2,直接通过这个库来识别就可以。但是对于有嘈杂的背景的验证码这种,直接识别识别率会很低,遇到这种我们就得需要先处理一下图片,先对图片进行灰度化,然后再进行二值化,再去识别,这样识别率会大大提高。
相关推荐:《Python入门教程》
2、滑动式验证码
这种是将备选碎片直线滑动到正确的位置,如下图:
解决思路:对于这种验证码就比较复杂一点,但也是有相应的办法。我们直接想到的就是模拟人去拖动验证码的行为,点击按钮,然后看到了缺口的位置,最后把拼图拖到缺口位置处完成验证。
第一步:点击按钮。然后我们发现,在你没有点击按钮的时候那个缺口和拼图是没有出现的,点击后才出现,这为我们找到缺口的位置提供了灵感。
第二步:拖到缺口位置。
我们知道拼图应该拖到缺口处,但是这个距离如果用数值来表示?
通过我们第一步观察到的现象,我们可以找到缺口的位置。这里我们可以比较两张图的像素,设置一个基准值,如果某个位置的差值超过了基准值,那我们就找到了这两张图片不一样的位置,当然我们是从那块拼图的右侧开始并且从左到右,找到第一个不一样的位置时就结束,这是的位置应该是缺口的left,所以我们使用selenium拖到这个位置即可。
这里还有个疑问就是如何能自动的保存这两张图?
这里我们可以先找到这个标签,然后获取它的location和size,然后 top,bottom,left,right = location['y'] ,location['y']+size['height']+ location['x'] + size['width'] ,然后截图,最后抠图填入这四个位置就行。
具体的使用可以查看selenium文档,点击按钮前抠张图,点击后再抠张图。最后拖动的时候要需要模拟人的行为,先加速然后减速。因为这种验证码有行为特征检测,人是不可能做到一直匀速的,否则它就判定为是机器在拖动,这样就无法通过验证了。
3、点击式的图文验证和图标选择
图文验证:通过文字提醒用户点击图中相同字的位置进行验证。
图标选择: 给出一组图片,按要求点击其中一张或者多张。借用万物识别的难度阻挡机器。
这两种原理相似,只不过是一个是给出文字,点击图片中的文字,一个是给出图片,点出内容相同的图片。
这两种没有特别好的方法,只能借助第三方识别接口来识别出相同的内容,推荐一个超级鹰,把验证码发过去,会返回相应的点击坐标。
然后再使用selenium模拟点击即可。具体怎么获取图片和上面方法一样。
4、宫格验证码
这种就很棘手,每一次出现的都不一样,但是也会出现一样的。而且拖动顺序都不一样。
但是我们发现不一样的验证码个数是有限的,这里采用模版匹配的方法。我觉得就好像暴力枚举,把所有出现的验证码保存下来,然后挑出不一样的验证码,按照拖动顺序命名,我们从左到右上下到下,设为1,2,3,4。上图的滑动顺序为4,3,2,1,所以我们命名4_3_2_1.png,这里得手动搞。当验证码出现的时候,用我们保存的图片一一枚举,与出现这种比较像素,方法见上面。如果匹配上了,拖动顺序就为4,3,2,1。然后使用selenium模拟即可。
4. 如何利用Python做简单的验证码识别
1摘要
验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的防火墙功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻。本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义。
然后经过了一年的时间,笔者又研究和get到了一种更强大的基于CNN卷积神经网络的直接端到端的验证识别技术(文章不是我的,然后我把源码整理了下,介绍和源码在这里面):
基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)
2关键词
关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL
3免责声明
本文研究所用素材来自于某旧Web框架的网站完全对外公开的公共图片资源。
本文只做了该网站对外公开的公共图片资源进行了爬取,并未越权做任何多余操作。
本文在书写相关报告的时候已经隐去漏洞网站的身份信息。
本文作者已经通知网站相关人员此系统漏洞,并积极向新系统转移。
本报告的主要目的也仅是用于OCR交流学习和引起大家对验证安全的警觉。
4引言
关于验证码的非技术部分的介绍,可以参考以前写的一篇科普类的文章:
互联网安全防火墙(1)--网络验证码的科普
里面对验证码的种类,使用场景,作用,主要的识别技术等等进行了讲解,然而并没有涉及到任何技术内容。本章内容则作为它的技术补充来给出相应的识别的解决方案,让读者对验证码的功能及安全性问题有更深刻的认识。
5基本工具
要达到本文的目的,只需要简单的编程知识即可,因为现在的机器学习领域的蓬勃发展,已经有很多封装好的开源解决方案来进行机器学习。普通程序员已经不需要了解复杂的数学原理,即可以实现对这些工具的应用了。
主要开发环境:
python3.5
python SDK版本
PIL
图片处理库
libsvm
开源的svm机器学习库
关于环境的安装,不是本文的重点,故略去。
6基本流程
一般情况下,对于字符型验证码的识别流程如下:
准备原始图片素材
图片预处理
图片字符切割
图片尺寸归一化
图片字符标记
字符图片特征提取
生成特征和标记对应的训练数据集
训练特征标记数据生成识别模型
使用识别模型预测新的未知图片集
达到根据“图片”就能返回识别正确的字符集的目标
7素材准备
7.1素材选择
由于本文是以初级的学习研究目的为主,要求“有代表性,但又不会太难”,所以就直接在网上找个比较有代表性的简单的字符型验证码(感觉像在找漏洞一样)。
最后在一个比较旧的网站(估计是几十年前的网站框架)找到了这个验证码图片。
原始图:
然后就将图片素材特征化,按照libSVM指定的格式生成一组带特征值和标记值的向量文
5. 如何利用Python做简单的验证码识别
先是获取验证码样本。。。我存了大概500个。
用dia测了测每个字之间的间距,直接用PIL开始切。
from PIL import Image
for j in range(0,500):
f=Image.open("../test{}.jpg".format(j))
for i in range(0,4):
f.crop((20+20*i,0,40+20*i,40)).save("test{0}-{1}.jpg".format(j,i+1))
上面一段脚本的意思是把jpg切成四个小块然后保存
之后就是二值化啦。
def TotallyShit(im):
x,y=im.size
mmltilist=list()
for i in range(x):
for j in range(y):
if im.getpixel((i,j))<200:
mmltilist.append(1)
else:
mmltilist.append(0)
return mmltilist
咳咳,不要在意函数的名字。上面的一段代码的意思是遍历图片的每个像素点,颜色数值小于200的用1表示,其他的用0表示。
其中的im代表的是Image.open()类型。
切好的图片长这样的。
只能说这样切的图片还是很粗糙,很僵硬。
下面就是分类啦。
把0-9,“+”,”-“的图片挑好并放在不同的文件夹里面,这里就是纯体力活了。
再之后就是模型建立了。
这里我试了自己写的还有sklearn svm和sklearn neural_network。发现最后一个的识别正确率高的多。不知道是不是我样本问题QAQ。
下面是模型建立的代码
from sklearn.neural_network import MLPClassifier
import numpy as np
def clf():
clf=MLPClassifier()
mmltilist=list()
X=list()
for i in range(0,12):
for j in os.listdir("douplings/douplings-{}".format(i)):
mmltilist.append(TotallyShit(Image.open("douplings/douplings-{0}/{1}".format(i,j)).convert("L")))
X.append(i)
clf.fit(mmltilist,X)
return clf
大概的意思是从图片源中读取图片和label然后放到模型中去跑吧。
之后便是图像匹配啦。
def get_captcha(self):
with open("test.jpg","wb") as f:
f.write(self.session.get(self.live_captcha_url).content)
gim=Image.open("test.jpg").convert("L")
recognize_list=list()
for i in range(0,4):
part=TotallyShit(gim.crop((20+20*i,0,40+20*i,40)))
np_part_array=np.array(part).reshape(1,-1)
predict_num=int(self.clf.predict(np_part_array)[0])
if predict_num==11:
recognize_list.append("+")
elif predict_num==10:
recognize_list.append("-")
else:
recognize_list.append(str(predict_num))
return ''.join(recognize_list)
最后eval一下识别出来的字符串就得出结果了。。
顺便提一句现在的bilibili登陆改成rsa加密了,麻蛋,以前的脚本全部作废,心好痛。
登陆的代码。
import time
import requests
import rsa
r=requests.session()
data=r.get("act=getkey&_="+str(int(time.time()*1000))).json()
pub_key=rsa.PublicKey.load_pkcs1_openssl_pem(data['key'])
payload = {
'keep': 1,
'captcha': '',
'userid': "youruserid",
'pwd': b64encode(rsa.encrypt((data['hash'] +"yourpassword").encode(), pub_key)).decode(),
}
r.post("",data=payload)
6. Python开发文字点选验证码,有什么推荐的方法
文字点选验证码(Click Captcha)是一种常见的验证码形式,纳雹通常由若干个字符或单词组成,要求用户点击其中指定的字符或单词,以验证用户身份。
在Python开发中实现文字点选验证码,一种常用的方法是使用图像处理库和机器学习库,以下是一些常用的库和方法:
PIL库:Python Imaging Library(PIL)是一个Python图像处理库,提供了丰富的图像处理功能,包括图像读写、缩放、旋转、裁剪、滤波等。可以使用PIL库生成包含随机字符的验证码图片,并将其保存为本地文件。
OpenCV库:OpenCV是一个计算机视觉库,提供了大量的图像处理和计算机视觉算法,包括图像读写、滤波、边缘检测、特征提取等。可以使用OpenCV库对验证码图片进行预处理,提取出验证码中的字符或单词,以便后续的识别。
PyTesseract库伍和:PyTesseract是一个Python的OCR库,基于Google的Tesseract-OCR引擎,可以对图像中的文字进行识别。可以使用PyTesseract库对验证码图片中的字符或单词进行识别和分类。
KNN算法:KNN是一种常用的机器学习算法,可以用于对验证腔茄盯码图片中的字符或单词进行分类。可以使用KNN算法对预处理后的验证码图片进行特征提取和分类,以识别出验证码中的正确字符或单词。
综合使用以上方法,可以实现一个较为稳定和准确的文字点选验证码。具体实现细节需要根据具体情况进行调整和优化。
7. python怎样调用第三方平台识别验证码
一、pytesseract介绍
1、pytesseract说明
pytesseract最新版本0.1.6,网址:h
Python-tesseract is a wrapper for google's Tesseract-OCR
( ht-ocr/ ). It is also useful as a
stand-alone invocation script to tesseract, as it can read all image types
supported by the Python Imaging Library, including jpeg, png, gif, bmp, tiff,
and others, whereas tesseract-ocr by default only supports tiff and bmp.
Additionally, if used as a script, Python-tesseract will print the recognized
text in stead of writing it to a file. Support for confidence estimates and
bounding box data is planned for future releases.
翻译一下大意:
a、Python-tesseract是一个基于google's Tesseract-OCR的独立封装包;
b、Python-tesseract功能是识别图片文件中文字,并作为返回参数返回识别结果;
c、Python-tesseract默认支持tiff、bmp格式图片,只有在安装PIL之后,才能支持jpeg、gif、png等其他图片格式;
2、pytesseract安装
INSTALLATION:
Prerequisites:
* Python-tesseract requires python 2.5 or later or python 3.
* You will need the Python Imaging Library (PIL). Under Debian/Ubuntu, this is
the package "python-imaging" or "python3-imaging" for python3.
* Install google tesseract-ocr from hsseract-ocr/ .
You must be able to invoke the tesseract command as "tesseract". If this
isn't the case, for example because tesseract isn't in your PATH, you will
have to change the "tesseract_cmd" variable at the top of 'tesseract.py'.
Under Debian/Ubuntu you can use the package "tesseract-ocr".
Installing via pip:
See the [pytesseract package page](hi/pytesseract)
```
$> sudo pip install pytesseract
翻译一下:
a、Python-tesseract支持python2.5及更高版本;
b、Python-tesseract需要安装PIL(Python Imaging Library) ,来支持更多的图片格式;
c、Python-tesseract需要安装tesseract-ocr安装包,具体参看上一篇博文。
综上,Pytesseract原理:
1、上一篇博文中提到,执行命令行 tesseract.exe 1.png output -l eng ,可以识别1.png中文字,并把识别结果输出到output.txt中;
2、Pytesseract对上述过程进行了二次封装,自动调用tesseract.exe,并读取output.txt文件的内容,作为函数的返回值进行返回。
二、pytesseract使用
USAGE:
```
> try:
> import Image
> except ImportError:
> from PIL import Image
> import pytesseract
> print(pytesseract.image_to_string(Image.open('test.png')))
> print(pytesseract.image_to_string(Image.open('test-european.jpg'),))
可以看到:
1、核心代码就是image_to_string函数,该函数还支持-l eng 参数,支持-psm 参数。
用法:
image_to_string(Image.open('test.png'),lang="eng" config="-psm 7")
2、pytesseract里调用了image,所以才需要PIL,其实tesseract.exe本身是支持jpeg、png等图片格式的。
实例代码,识别某公共网站的验证码(大家千万别干坏事啊,思虑再三,最后还是隐掉网站域名,大家去找别的网站试试吧……):
View Code
8. 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,之后我们来看看我们的结果:
我们可以看到现在的二维码就比较方便我们进行识别了;那么对于一些有干扰的图片,我们做一些灰度和二值化处理,这会提高图片识别的正确率。
9. python验证码识别模块
只需要简单几步操作即可拥有两大通用识别模块,让你在工作中畅通无阻。
测试图片 test1.png
测试图片 test2.jpg
以上参数两者选其一即可,默认 model_type 为 ModelType.OCR, 若指定 conf_path 参数则优先使用自定义模型。
注意: 因模块过新,阿里/清华等第三方源可能尚未更新镜像,因此手动指定使用境外源,为了提高依赖的安装速度,可预先自行安装依赖:tensorflow/numpy/opencv-python/pillow/pyyaml
输出结果:
OCR和验证码识别的速度基本都在10ms左右,低配CPU可能需要15-20ms。本模块仅支持单行识别,如有多行识别需求请自行采用目标检测预裁图片。