【前言】几天研究验证码解决方案有三种吧。第一、手工输入,即保存图片后然后我们手工输入;第二、使用cookie,必须输入密码一次,获取cookie;第三、图像处理+深度学习方案,研究生也做相关课题,就用了这种。

一、处理思路

  1、图像处理,针对我要识别的期货中心的验证码,有我针对性的处理。目标是得到去噪后的二值图片,然后使用深度学习神经网络方法进行识别。

  2、第一次尝试了用谷歌的开源tesseract-ocr方法,做了一个模型训练。因为都是集成好的开发环境,自动分割,自己只需手动的调整一些识别错误的。准确率还是可以的。

  3、使用了腾讯的免费ocr接口,是被效果大大提升。最后用一个正则表达式加一个提取器,只提取字母和数字。识别率百分之90是有的。

  直接上代码。亲测可用自动登录中国期货市场监控中心的网站https://investorservice.cfmmc.com/

  1 # /usr/bin/python
2 # encoding: utf-8
3
4 import time
5 from selenium import webdriver
6 import sys
7 import urllib2
8 import urllib
9 import time
10 import re
11
12 from PIL import Image
13 from pytesseract import *
14 import PIL.ImageOps
15
16 import requests
17 import hmac
18 import hashlib
19 import base64
20 import time
21 import random
22
23 #方案一:在线二维码识别(也是先下载到本地,但是由于动态二维码原因,两次获取的页面不一样,导致验证码不匹配。匹配不成功)
24 #下面有针对此方案的解决方法,就是解析同一个界面下的验证码,先下载到本地,然后上传处理。这种适合服务器不能图片截屏获取二维码,可以使用session或者cookie方式。
25 def yanzheng_online():
26 # 爬取图片
27 reload(sys)
28 sys.setdefaultencoding('utf8')
29
30 headers = ("User-Agent",
31 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36")
32 opener = urllib2.build_opener()
33 opener.addheaders = [headers]
34 urllib2.install_opener(opener)
35
36 #循环爬取多张,建立数据集
37 # for i in range(1, 1500):
38 # url = "https://investorservice.cfmmc.com/veriCode.do?t=1531728079700" + str(i)
39 # data = urllib2.urlopen(url).read()
40 # # data=urllib2.quote(data).decode('utf-8')
41 # file = "G:/360Downloads/pic/" + str(i) + ".png"
42 # playFile = open(file, 'wb')
43 # playFile.write(data)
44 # playFile.close()
45 # time.sleep(1)
46 url = "https://investorservice.cfmmc.com/veriCode.do?t=1531728079700"
47 data = urllib2.urlopen(url).read()
48 file = "G:/360Downloads/pic/" + "yanzhengma" + ".png"
49 playFile = open(file, 'wb')
50 playFile.write(data)
51 playFile.close()
52 time.sleep(1)
53
54 # 图像处理
55 im = Image.open('G:/360Downloads/pic/yanzhengma.png')
56
57 im = im.convert('L')
58 #im.show()
59 im2 = im.point(lambda x: 0 if x > 200 else 255)
60 #im2.show()
61 im3 = im2.save("G:/360Downloads/pic/yanzhengma.png")
62
63 # 借助腾讯免费的OCR识别
64 appid = "1257XX2374" # 写入自己的腾讯云号码,我修改了
65 # bucket = "你的bucket" # 不要也可以
66 secret_id = "AKIDGKXXXXXXXXX1XnnWyA5sFgz" # 写入自己的账号里面的地址
67 secret_key = "EDwRggaXXXXXXXXXXysY0CA" # 同上
68 expired = time.time() + 2592000
69 onceExpired = 0
70 current = time.time()
71 rdm = ''.join(random.choice("0123456789") for i in range(10))
72 userid = "0"
73 fileid = "tencentyunSignTest"
74
75 info = "a=" + appid + "&k=" + secret_id + "&e=" + str(expired) + "&t=" + str(current) + "&r=" + str(
76 rdm) + "&u=0&f=" # 去掉bucket
77
78 signindex = hmac.new(secret_key, info, hashlib.sha1).digest() # HMAC-SHA1加密
79 sign = base64.b64encode(signindex + info) # base64转码
80
81 url = "http://recognition.image.myqcloud.com/ocr/general"
82 headers = {'Host': 'recognition.image.myqcloud.com',
83 "Authorization": sign,
84 }
85 files = {'appid': (None, appid),
86 # 'bucket': (None, bucket),
87 'image': ('yanzhengma.png', open('G:/360Downloads/pic/yanzhengma.png', 'rb'), 'image/jpeg')
88
89 }
90
91 r = requests.post(url, files=files, headers=headers)
92 responseinfo = r.content
93 #print responseinfo
94 # 创建内存中的word文档对象
95 # file=docx.Document()
96 r_index = r'itemstring":"(.*?)"' # 做一个正则匹配,会匹配出一些特殊符号
97 result = re.findall(r_index, responseinfo)
98 #print result
99 # result2=re.findall(r'\w+',result)
100 # new_crazy = filter(str.isalnum, result)
101 # print new_crazy
102 a = 0
103 for i in result:
104 # file.add_paragraph(i)
105 # 只识别出数字和字母
106 new_crazy = filter(str.isalnum, i)
107 #print new_crazy
108 a = new_crazy
109 # file.save("D:\\writeResult.docx")
110 return a
111
112 #方案二:网页裁剪验证码,本地识别识别。匹配成功!!
113 def yanzheng_local():
114 #对截取的图片处理
115 im = Image.open('G:/360Downloads/pic/yanzhengma.png')
116 box = (526, 247, 623, 273) # 设置要裁剪的区域96*25,根据自己验证码位置
117 region = im.crop(box) # 此时,region是一个新的图像对象。
118 # region.show()#显示的话就会被占用,所以要注释掉
119 region.save("G:/360Downloads/pic/yanzhengma.png")
120 # 爬取图片
121 reload(sys)
122 sys.setdefaultencoding('utf8')
123
124 headers = ("User-Agent",
125 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36")
126 opener = urllib2.build_opener()
127 opener.addheaders = [headers]
128 urllib2.install_opener(opener)
129
130 # 图像处理
131 im = Image.open('G:/360Downloads/pic/yanzhengma.png')
132
133 im = im.convert('L')
134 #im.show()
135 im2 = im.point(lambda x: 0 if x > 200 else 255)
136 #im2.show()
137 im3 = im2.save("G:/360Downloads/pic/yanzhengma.png")
138
139 # 腾讯ocr识别
140 appid = "1257XXX374" # 写入自己的腾讯云号码
141 # bucket = "你的bucket" # 不要也可以
142 secret_id = "AKIDGKXXXXXXXXnnWyA5sFgz" # 写入自己的账号里面的地址
143 secret_key = "EDwRggaXXXXXXXXtVrysY0CA" # 同上
144 expired = time.time() + 2592000
145 onceExpired = 0
146 current = time.time()
147 rdm = ''.join(random.choice("0123456789") for i in range(10))
148 userid = "0"
149 fileid = "tencentyunSignTest"
150
151 info = "a=" + appid + "&k=" + secret_id + "&e=" + str(expired) + "&t=" + str(current) + "&r=" + str(
152 rdm) + "&u=0&f=" # 去掉bucket
153
154 signindex = hmac.new(secret_key, info, hashlib.sha1).digest() # HMAC-SHA1加密
155 sign = base64.b64encode(signindex + info) # base64转码
156
157 url = "http://recognition.image.myqcloud.com/ocr/general"
158 headers = {'Host': 'recognition.image.myqcloud.com',
159 "Authorization": sign,
160 }
161 files = {'appid': (None, appid),
162 # 'bucket': (None, bucket),
163 'image': ('yanzhengma.png', open('G:/360Downloads/pic/yanzhengma.png', 'rb'), 'image/jpeg')
164
165 }
166
167 r = requests.post(url, files=files, headers=headers)
168 responseinfo = r.content
169 #print responseinfo
170 # 创建内存中的word文档对象
171 # file=docx.Document()
172 r_index = r'itemstring":"(.*?)"' # 做一个正则匹配
173 result = re.findall(r_index, responseinfo)
174 #print result
175 # result2=re.findall(r'\w+',result)
176 # new_crazy = filter(str.isalnum, result)
177 # print new_crazy
178 a = 0
179 for i in result:
180 # file.add_paragraph(i)
181 # 只识别出数字和字母
182 new_crazy = filter(str.isalnum, i)
183
184 #print new_crazy
185 a = new_crazy
186 # print 'a'
187 # file.save("D:\\writeResult.docx")
188 return a
189
190 def login(username, password):
191
192 url = 'https://investorservice.cfmmc.com '
193
194 driver = webdriver.Chrome(executable_path='C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')
195 driver.get(url)
196 # print driver.title
197 name_input = driver.find_element_by_name('userID') # 找到用户名的框框
198 pass_input = driver.find_element_by_name('password') # 找到输入密码的框框
199 yanzheng_input=driver.find_element_by_name('vericode') #验证码输入框
200 login_button = driver.find_element_by_name('imageField2') # 找到登录按钮
201
202 name_input.clear()
203 name_input.send_keys(username) # 填写用户名
204 time.sleep(0.2)
205 pass_input.clear()
206 pass_input.send_keys(password) # 填写密码
207 #验证码获取
208 #local方法专用,截取验证码所在的网页
209 driver.get_screenshot_as_file('G:/360Downloads/pic/yanzhengma.png') # 截图网页保存
210
211
212 #yzm=yanzheng_online()
213 #使用本地裁剪识别,即方案二
214 yzm=yanzheng_local()
215 print yzm
216 yanzheng_input.send_keys(yzm)
217 time.sleep(1.2)
218 login_button.click() # 点击登录
219
220 time.sleep(1.2)
221 #print driver.get_cookies()
222
223 #打印“登录成功”表示成功,否则重新运行
224 if('login'in driver.current_url):
225 print "登录成功"
226 driver.close()
227
228 if __name__ == "__main__":
229 #账号密码
230 user = "xxxxxxx"
231 pw = "xxxxxxxx"
232 login(user, pw)

#后面会继续实现cookie保存,爬取信息,存储数据库。
二、最好的解决方法 
  这几天深入了解了python爬虫,因为要在登录之后,请求新的网页时要保持登录,不然在请求新的网页时又会跳转到登录页面。如何保持登录呢?两种方式,本地携带cookie访问,服务器端保持session.如此,不如在登录的时候采用登录保持的方式,保持session.(当然携带cookie也可以)。这几天学习了抓包分析表单,实现了请求cookie,提交token.还有一个验证码,就采用网页抓取,正则解析出验证码地址,下载本地上传深度学习模型,识别出验证码传入post表单。
源码地址:https://www.cnblogs.com/huangfuyuan/p/9356747.html
  本方法适用于windows带图形界面的,不适用于服务器。
三、验证码生成原理及python代码
 1 def verifycode(request):
2 # 引入绘图模块
3 from PIL import Image, ImageDraw, ImageFont
4 # 引入随机函数模块
5 import random
6 # 定义变量,用于画面的背景色、宽、高
7 bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100)) width = 100 height = 50
8 # 创建画面对象
9 im = Image.new('RGB',(width, height),bgcolor)
10 # 创建画笔对象
11 draw = ImageDraw.Draw(im)
12 # 调用画笔的point()函数绘制噪点
13 for i in range(0, 100):
14 xy = (random.randrange(0, width), random,randrange(0, height))
15 fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
16 draw.point(xy, fill=fill)
17 # 定义验证码的备选值
18 str = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM'
19 # 随机选取四个值作为验证码
20 rand_str = ''
21 for i in range(0,4):
22 rand_str += str[random.randrange(0, len(str))]
23 # 构建字体对象 ,读取本地字体模板
24 font = ImageFont.truetype(r'C\Windows\Fonts\AdobeArabic-Bold.otf', 40)
25 # 构建字体颜色
26 fontcolor1 =(255, random.randrange(0, 255), random.randrange(0, 255))
27 fontcolor2 =(255, random.randrange(0, 255), random.randrange(0, 255))
28 fontcolor3 =(255, random.randrange(0, 255), random.randrange(0, 255))
29 fontcolor4 =(255, random.randrange(0, 255), random.randrange(0, 255))
30 # 绘制四个字
31 draw.text((5, 2), rand_str[0], font=font, fill=fontcolor1)
32 draw.text((25, 2), rand_str[1], font=font, fill=fontcolor2)
33 draw.text((50, 2), rand_str[2], font=font, fill=fontcolor3)
34 draw.text((75, 2), rand_str[3], font=font, fill=fontcolor4)
35 # 释放画笔
36 del draw
37 # 存入session , 用于做进一步验证
38 request.session['verifycode'] = rand_str
39 # 内存文件操作
40 import io buf = io.BytesIO()
41 # 将图片保存在内存中,文件类型为png
42 im.safe(buf, 'png')
43 # 将内存中的图片数据返回给客户端,MIME类型为图片png
44 return HttpResponse(buf.getValue(), 'image/png')

python爬虫模拟登录验证码解决方案的更多相关文章

  1. python爬虫模拟登录的图片验证码处理和会话维持

    目标网站:古诗文网 登录界面显示: 打开控制台工具,输入账号密码,在ALL栏目中进行抓包 数据如下: 登录请求的url和请求方式 登录所需参数 参数分析: __VIEWSTATE和__VIEWSTAT ...

  2. Python爬虫模拟登录带验证码网站

    问题分析: 1.爬取网站时经常会遇到需要登录的问题,这是就需要用到模拟登录的相关方法.python提供了强大的url库,想做到这个并不难.这里以登录学校教务系统为例,做一个简单的例子. 2.首先得明白 ...

  3. 【爬虫】python requests模拟登录知乎

    需求:模拟登录知乎,因为知乎首页需要登录才可以查看,所以想爬知乎上的内容首先需要登录,那么问题来了,怎么用python进行模拟登录以及会遇到哪些问题? 前期准备: 环境:ubuntu,python2. ...

  4. python爬虫中图形验证码的处理

    使用python爬虫自动登录时,遇到需要输入图形验证码的情况,一个比较简单的处理方法是使用打码平台识别验证码. 使用过两个打码平台,打码兔和若快,若快的价格更便宜,识别率相当.若快需要注册两个帐号:开 ...

  5. Python requests模拟登录

    Python requests模拟登录 #!/usr/bin/env python # encoding: UTF-8 import json import requests # 跟urllib,ur ...

  6. 用python实现模拟登录人人网

    用python实现模拟登录人人网 字数4068 阅读1762 评论19 喜欢46 我决定从头说起.懂的人可以快速略过前面理论看最后几张图. web基础知识 从OSI参考模型(从低到高:物理层,数据链路 ...

  7. Python - WebDriver 识别登录验证码

    Python - WebDriver 识别登录验证码 没什么可说的直接上代码! #-*-coding:utf-8-*- # Time:2017/9/29 7:16 # Author:YangYangJ ...

  8. python爬虫模拟登陆

    python爬虫模拟登陆 学习了:https://www.cnblogs.com/chenxiaohan/p/7654667.html  用的这个 学习了:https://www.cnblogs.co ...

  9. 使用Python+Selenium模拟登录QQ空间

    使用Python+Selenium模拟登录QQ空间爬QQ空间之类的页面时大多需要进行登录,研究QQ登录规则的话,得分析大量Javascript的加密解密,这绝对能掉好几斤头发.而现在有了seleniu ...

随机推荐

  1. Java排序算法(一)冒泡排序

    一.测试类SortTest  import java.util.Arrays; public class SortTest { private static final int L = 20; pub ...

  2. Codeforces Round #626 (Div. 2) D. Present(位运算)

    题意: 求n个数中两两和的异或. 思路: 逐位考虑,第k位只需考虑0~k-1位,可通过&(2k+1-1)得到一组新数. 将新数排序,当两数和在[2k,2k+1)和[2k+1+2k,2k+2)之 ...

  3. HDU5740 Glorious Brilliance【最短路 KM匹配】

    HDU5740 Glorious Brilliance 题意: 给出一张不一定合法的染色图,每次可以交换相邻两点的颜色,问最少多少次能使染色图合法 合法的染色图相邻点的颜色不能相同 题解: 首先要确定 ...

  4. 【poj 1182】食物链(图论--带权并查集)

    题意:有3种动物A.B.C,形成一个"A吃B, B吃C,C吃A "的食物链.有一个人对N只这3类的动物有M种说法:第一种说法是"1 X Y",表示X和Y是同类. ...

  5. java实现定时任务解决方案

    在线corn表达式 1. 总结常见的实现定时任务的几种方法 thread实现 [原理:通过创建一个线程,让他在while循环里面一直运行,用sleep() 方法让其休眠从而达到定时任务的效果.] Ti ...

  6. 【ybt金牌导航1-2-5】【luogu P3287】优美玉米 / 方伯伯的玉米田

    优美玉米 / 方伯伯的玉米田 题目链接:ybt金牌导航1-2-5 / luogu P3287 题目大意 有一个数组,你可以每次给一个区间里面的值加一,要你使得最后剩下的最长单调不下降子序列最长. 思路 ...

  7. 【原创】docker & kubernetes问题总结

    1.entrypoint & cmd 指令的区别 这主要考察 Dockerfile 良好实践中关于容器启动时运行的命令. entrypoint 和 cmd 命令都是设置容器启动时要执行的命令, ...

  8. 微服务架构Day04-SpringBoot之web开发

    引入项目 把html页面放在模板引擎文件夹templates下,这样能使用模板引擎的功能. 登录页面国际化 国际化:编写国际化配置文件 1.编写国际化配置文件,抽取页面需要显示的国际化消息 2.Spr ...

  9. CSS hover box

    CSS hover box transition 踩坑指南, display: none; 作为初始状态,不会产生动画效果,必须设置 height: 0; 或 width: 0; 来实现隐藏! tra ...

  10. p5.js

    p5.js p5.j​​s是一个用于创意编码的JavaScript库,其重点是使艺术家,设计师,教育者,初学者以及其他任何人都可以访问并包含所有编码! https://p5js.org/ https: ...