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实现获取序列中最小的几个元素
Sep 25 Python
python创建关联数组(字典)的方法
May 04 Python
Python语法快速入门指南
Oct 12 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
一篇文章读懂Python赋值与拷贝
Apr 19 Python
python实现排序算法解析
Sep 08 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
PythonPC客户端自动化实现原理(pywinauto)
May 28 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 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根据年月获取季度的方法
2014/03/31 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
php操作mongoDB实例分析
2014/12/29 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
joomla数据库操作示例代码
2016/01/06 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
JQuery FlexiGrid的asp.net完美解决方案 dotNetFlexGrid-.Net原生的异步表格控件
2010/09/12 Javascript
一起来写段JS drag拖动代码
2010/12/09 Javascript
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
JQuery复制DOM节点的方法
2015/06/11 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
2016/06/28 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
2019/11/09 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
详解vue3中组件的非兼容变更
2021/03/03 Vue.js
Python中__new__与__init__方法的区别详解
2015/05/04 Python
python连接mysql实例分享
2016/10/09 Python
python 实现list或string按指定分段
2019/12/25 Python
python+OpenCV实现图像拼接
2020/03/05 Python
Python读写操作csv和excle文件代码实例
2020/03/16 Python
python中for in的用法详解
2020/04/17 Python
python 绘制国旗的示例
2020/09/27 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
求职信的七个关键技巧
2014/02/05 职场文书
大学辅导员事迹材料
2014/02/05 职场文书
高一新生军训方案
2014/05/12 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
vue实现移动端div拖动效果
2022/03/03 Vue.js