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


Posted in Python onJanuary 22, 2016

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

首先得明白cookie的作用,cookie是某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据。因此我们需要用Cookielib模块来保持网站的cookie。

这个是要登陆的地址 http://202.115.80.153/ 和验证码地址 http://202.115.80.153/CheckCode.aspx

可以发现这个验证码是动态更新的每次打开都不一样,一般这种验证码和cookie是同步的。其次想识别验证码肯定是吃力不讨好的事,因此我们的思路是首先访问验证码页面,保存验证码、获取cookie用于登录,然后再直接向登录地址post数据。

首先通过抓包工具或者火狐或者谷歌浏览器分析登录页面需要post的request和header信息。以谷歌浏览器为例。

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

从中可以看出需要post的url并不是访问的页面,而是http://202.115.80.153/default2.aspx,

其中需要提交的表单数据中txtUserName和TextBox2分别用户名和密码。

现在直接到关键部分 上代码!!

import urllib2
import cookielib
import urllib
import re
import sys
'''模拟登录'''
reload(sys)
sys.setdefaultencoding("utf-8")
# 防止中文报错
CaptchaUrl = "http://202.115.80.153/CheckCode.aspx"
PostUrl = "http://202.115.80.153/default2.aspx"
# 验证码地址和post地址
cookie = cookielib.CookieJar()
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
# 将cookies绑定到一个opener cookie由cookielib自动管理
username = 'username'
password = 'password123'
# 用户名和密码
picture = opener.open(CaptchaUrl).read()
# 用openr访问验证码地址,获取cookie
local = open('e:/image.jpg', 'wb')
local.write(picture)
local.close()
# 保存验证码到本地
SecretCode = raw_input('输入验证码: ')
# 打开保存的验证码图片 输入
postData = {
'__VIEWSTATE': 'dDwyODE2NTM0OTg7Oz6pH0TWZk5t0lupp/tlA1L+rmL83g==',
'txtUserName': username,
'TextBox2': password,
'txtSecretCode': SecretCode,
'RadioButtonList1': '学生',
'Button1': '',
'lbLanguage': '',
'hidPdrs': '',
'hidsc': '',
}
# 根据抓包信息 构造表单
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36',
}
# 根据抓包信息 构造headers
data = urllib.urlencode(postData)
# 生成post数据 ?key1=value1&key2=value2的形式
request = urllib2.Request(PostUrl, data, headers)
# 构造request请求
try:
response = opener.open(request)
result = response.read().decode('gb2312')
# 由于该网页是gb2312的编码,所以需要解码
print result
# 打印登录后的页面
except urllib2.HTTPError, e:
print e.code
# 利用之前存有cookie的opener登录页面

登录成功后便可以利用该openr访问其他需要登录才能访问的页面。

Python 相关文章推荐
Python创建日历实例
Aug 21 Python
python遍历目录的方法小结
Apr 28 Python
Python+Selenium自动化实现分页(pagination)处理
Mar 31 Python
Python实现句子翻译功能
Nov 14 Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 Python
python批量修改图片后缀的方法(png到jpg)
Oct 25 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
python for 循环获取index索引的方法
Feb 01 Python
Django模型中字段属性choice使用说明
Mar 30 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
Jun 01 Python
Django REST framework 限流功能的使用
Jun 24 Python
Fiddler如何抓取手机APP数据包
Jan 22 #Python
Python爬虫抓取手机APP的传输数据
Jan 22 #Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 #Python
Python中使用urllib2模块编写爬虫的简单上手示例
Jan 20 #Python
Python模拟百度登录实例详解
Jan 20 #Python
Python的Scrapy爬虫框架简单学习笔记
Jan 20 #Python
使用Python编写爬虫的基本模块及框架使用指南
Jan 20 #Python
You might like
用PHP实现小型站点广告管理(修正版)
2006/10/09 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
php如何执行非缓冲查询API
2016/07/22 PHP
Apache PHP MySql安装配置图文教程
2016/08/27 PHP
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
某页码显示的helper 少量调整,另附js版
2010/09/12 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
2015/02/18 Javascript
JS控制表格实现一条光线流动分割行的方法
2015/03/09 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
2015/09/14 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
JS与CSS3实现图片响应鼠标移动放大效果示例
2018/05/04 Javascript
Vue 框架之键盘事件、健值修饰符、双向数据绑定
2018/11/14 Javascript
解决vue项目获取dom元素宽高总是不准确问题
2020/07/29 Javascript
python正则表达式re模块详细介绍
2014/05/29 Python
详解python单例模式与metaclass
2016/01/15 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python类的继承和多态代码详解
2017/12/27 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
介绍一下UNIX启动过程
2013/11/14 面试题
少先队学雷锋活动月总结
2014/03/09 职场文书
安全月活动总结
2014/05/05 职场文书
幼儿园见习总结
2015/06/23 职场文书
2015大一新生军训感言
2015/08/01 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python