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 相关文章推荐
centos系统升级python 2.7.3
Jul 03 Python
Python中的hypot()方法使用简介
May 18 Python
Python中Django 后台自定义表单控件
Mar 28 Python
解决win64 Python下安装PIL出错问题(图解)
Sep 03 Python
关于Python 的简单栅格图像边界提取方法
Jul 05 Python
python自动发微信监控报警
Sep 06 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
Nov 21 Python
python3实现绘制二维点图
Dec 04 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
Pytest allure 命令行参数的使用
Apr 18 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 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
MVC模式的PHP实现
2006/10/09 PHP
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
php中的抽象方法和抽象类
2017/02/14 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
解决js数据包含加号+通过ajax传到后台时出现连接错误
2013/08/01 Javascript
jQuery实现高亮显示网页关键词的方法
2015/08/07 Javascript
前端设计师们最常用的JS代码汇总
2016/09/25 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
js实现数组内数据的上移和下移的实例
2017/11/14 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
VScode格式化ESlint方法(最全最好用方法)
2019/09/10 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
[13:21]DOTA2国际邀请赛采访专栏:RSnake战队国士无双,Fnatic.Fly
2013/08/06 DOTA
Python的Flask框架应用调用Redis队列数据的方法
2016/06/06 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
python re模块常见用法例举
2021/03/01 Python
三下乡活动方案
2014/01/31 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书
社区食品安全实施方案
2014/03/28 职场文书
食品销售计划书
2014/04/26 职场文书
施工质量承诺书范文
2014/05/30 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
毕业季聚会祝酒词!
2019/07/04 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python