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 相关文章推荐
python里将list中元素依次向前移动一位
Sep 12 Python
python基于xml parse实现解析cdatasection数据
Sep 30 Python
Python语言描述连续子数组的最大和
Jan 04 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
Django1.11配合uni-app发起微信支付的实现
Oct 12 Python
Python如何使用函数做字典的值
Nov 30 Python
Python Numpy中数据的常用保存与读取方法
Apr 01 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 Python
python 实现关联规则算法Apriori的示例
Sep 30 Python
Python中读取文件名中的数字的实例详解
Dec 25 Python
使用python对excel表格处理的一些小功能
Jan 25 Python
python3 sqlite3限制条件查询的操作
Apr 07 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
一个oracle+PHP的查询的例子
2006/10/09 PHP
php 无限级分类学习参考之对ecshop无限级分类的解析 带详细注释
2010/03/23 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
分享下页面关键字抓取components.arrow.com站点代码
2014/01/30 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
event.srcElement+表格应用
2006/08/29 Javascript
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
JavaScript在网页中画圆的函数arc使用方法
2015/11/13 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
javascript基础知识讲解
2017/01/11 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
微信小程序canvas拖拽、截图组件功能
2018/09/04 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
手把手教你使用Python创建微信机器人
2019/04/29 Python
python 实现查询Neo4j多节点的多层关系
2019/12/23 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
生产厂长岗位职责
2014/02/21 职场文书
保安2014年终工作总结
2014/12/06 职场文书
村党总支部公开承诺书2016
2016/03/25 职场文书
来探秘“德国中小企业”的成功之道
2019/07/26 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
MySQL快速插入一亿测试数据
2021/06/23 MySQL
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS