python爬虫解决验证码的思路及示例


Posted in Python onAugust 01, 2019

如果直接从生成验证码的页面把验证码下载到本地后识别,再构造表单数据发送的话,会有一个验证码同步的问题,即请求了两次验证码,而识别出来的验证码并不是实际需要发送的验证码。有如下几种方法解决。

法1:

用session:

mysession = requests.Session()
login_url = 'http://xxx.com'
checkcode_url='http://yyy.com'
html = mysession.get(login_url,timeout=60*4)
#....balabala解析操作....
checkcode = mysession.get(checkcode_url,timeout=60*4)
with open('checkcode.png','wb') as f:
  f.write(checkcode.content)
 
#接下来balabala对图像操作,可以用python的相关库(识别率低,教务网的验证码都够呛),也可以用云速等第三方验证码识别网站提供的有偿服务(识别度较高)
 
#再接下来构造表单数据balabala

法2:

用cookie:

#绑定cookie
checkcode_url='http://yyy.com'
cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
 
#先读取验证码的url
picture = opener.open(checkcode_url).read()
 
#balabala图像处理
 
# 生成post数据 
data = urllib.urlencode(postData)
# 构造request请求
request = urllib2.Request(PostUrl, data, headers)
# 利用之前存有cookie的opener登录页面
try:
  response = opener.open(request)
  result = response.read()
except urllib2.HTTPError, e:
  print e.code

法3:

selenium+手动构造cookie: 该方法无需识别验证码,本人尚未尝试。

webdriver 操作 cookie 的方法有:

  • get_cookies() 获得所有 cookie 信息
  • get_cookie(name) 返回特定 name 有 cookie 信息
  • add_cookie(cookie_dict) 添加 cookie,必须有 name 和 value 值
  • delete_cookie(name) 删除特定(部分)的 cookie 信息
  • delete_all_cookies() 删除所有 cookie 信息
....
#第一次访问 xxx 网站
driver.get("http://xxx.com")
#将用户名密码写入浏览器 cookie
driver.add_cookie({'name':'username','value':'username'})
driver.add_cookie({'name':'password','value':'password'})
#再次访问 xxx 网站,将会自动登录
driver.get("http://xxx.com")
time.sleep(5)
....
driver.quit()

这种方法难点在于确定该网站是用cookie中的什么key值来表示“用户名”和“密码”的。而且好像有些cookie是加密过的。可以先用get_cookies()进行观察。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用grappelli为django admin后台添加模板
Nov 18 Python
Python面向对象之类和对象属性的增删改查操作示例
Dec 14 Python
简单了解python gevent 协程使用及作用
Jul 22 Python
python正则-re的用法详解
Jul 28 Python
python matplotlib拟合直线的实现
Nov 19 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
python操作docx写入内容,并控制文本的字体颜色
Feb 13 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
Pytorch高阶OP操作where,gather原理
Apr 30 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 Python
python接口自动化框架实战
Dec 23 Python
Python实现简单得递归下降Parser
May 02 Python
Django多数据库的实现过程详解
Aug 01 #Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 #Python
numpy.meshgrid()理解(小结)
Aug 01 #Python
Python-接口开发入门解析
Aug 01 #Python
Python列表(list)所有元素的同一操作解析
Aug 01 #Python
详解numpy.meshgrid()方法使用
Aug 01 #Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 #Python
You might like
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
PHP连接和操作MySQL数据库基础教程
2014/09/29 PHP
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
实例讲解jQuery中对事件的命名空间的运用
2016/05/24 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
Angular实现表单验证功能
2017/11/13 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
详解在create-react-app使用less与antd按需加载
2018/12/06 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
2020/06/11 Javascript
python在ubuntu中的几种安装方法(小结)
2017/12/08 Python
python命令行解析之parse_known_args()函数和parse_args()使用区别介绍
2018/01/24 Python
简单谈谈Python的pycurl模块
2018/04/07 Python
Python list列表中删除多个重复元素操作示例
2019/02/27 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
python访问hdfs的操作
2020/06/06 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
安装pyinstaller遇到的各种问题(小结)
2020/11/20 Python
python中判断数字是否为质数的实例讲解
2020/12/06 Python
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
小学教师2014年度工作总结
2014/12/03 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android