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编程实现语音控制电脑
Apr 01 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
Python 模拟购物车的实例讲解
Sep 11 Python
分析python切片原理和方法
Dec 19 Python
python 搜索大文件的实例代码
Jul 08 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
Python flask路由间传递变量实例详解
Jun 03 Python
sqlalchemy实现时间列自动更新教程
Sep 02 Python
Python3利用openpyxl读写Excel文件的方法实例
Feb 03 Python
Python第三方库安装缓慢的解决方法
Feb 06 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 反射机制实现动态代理的代码
2008/10/22 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
php中get_cfg_var()和ini_get()的用法及区别
2015/03/04 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
vue页面切换过渡transition效果
2018/10/08 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
浅谈Python实现贪心算法与活动安排问题
2017/12/19 Python
Python pyinotify日志监控系统处理日志的方法
2018/03/08 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
使用PIL(Python-Imaging)反转图像的颜色方法
2019/01/24 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
4s店总经理岗位职责
2013/12/31 职场文书
人力资源部经理助理岗位职责
2014/03/04 职场文书
遗产继承公证书
2014/04/09 职场文书
食品安全标语
2014/06/07 职场文书
公司证明怎么写
2014/09/22 职场文书
防灾减灾标语
2014/10/07 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
离职证明格式样本
2015/06/12 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Golang日志包的使用
2022/04/20 Golang