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实现ftp客户端示例分享
Feb 17 Python
Python使用functools模块中的partial函数生成偏函数
Jul 02 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
Python基于ThreadingTCPServer创建多线程代理的方法示例
Jan 11 Python
python去掉空白行的多种实现代码
Mar 19 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
Python如何获取Win7,Win10系统缩放大小
Jan 10 Python
python 双循环遍历list 变量判断代码
May 04 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
Jun 17 Python
Python中用xlwt制作表格实例讲解
Nov 05 Python
Python 制作自动化翻译工具
Apr 25 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 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中返回引用类型的方法
2015/04/03 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
JavaScript 事件的一些重要说明
2009/10/25 Javascript
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
element-ui 关于获取select 的label值方法
2018/08/24 Javascript
JS实现数组的增删改查操作示例
2018/08/29 Javascript
JavaScript根据json生成html表格的示例代码
2018/10/24 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
python技能之数据导出excel的实例代码
2017/08/11 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
PyCharm无法引用自身项目解决方式
2020/02/12 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
介绍一下XMLHttpRequest对象
2012/02/12 面试题
总裁办公室主任职责
2014/01/02 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
升国旗演讲稿
2014/09/05 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
个人汇报材料范文
2014/12/30 职场文书