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获取任意xml节点值的方法
May 05 Python
Android应用开发中Action bar编写的入门教程
Feb 26 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
Python random模块用法解析及简单示例
Dec 18 Python
Python爬虫之正则表达式的使用教程详解
Oct 25 Python
Python List cmp()知识点总结
Feb 18 Python
selenium+python环境配置教程详解
May 28 Python
pandas数据处理进阶详解
Oct 11 Python
Pandas 解决dataframe的一列进行向下顺移问题
Dec 27 Python
python时间与Unix时间戳相互转换方法详解
Feb 13 Python
python开发前景如何
Jun 11 Python
python自动化调用百度api解决验证码
Apr 13 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和javascript之间变量的传递实现代码
2012/12/19 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
php blowfish加密解密算法
2016/07/02 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
小议Javascript中的this指针
2010/03/18 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
jQuery 1.8 Release版本发布了
2012/08/14 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
js中的eventType事件及其浏览器支持性介绍
2013/11/29 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
vant实现购物车功能
2020/06/29 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
Python实现购物车功能的方法分析
2017/11/10 Python
Python数据结构之栈、队列的实现代码分享
2017/12/04 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
浅谈Python中re.match()和re.search()的使用及区别
2020/04/14 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
巴黎卡诗加拿大官网:Kérastase加拿大
2018/11/12 全球购物
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
国庆节促销广告语2014
2014/09/19 职场文书
2014年后勤工作总结范文
2014/12/16 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
Spring整合Mybatis的全过程
2021/06/28 Java/Android
python如何查找列表中元素的位置
2022/05/30 Python
Linux磁盘管理方法介绍
2022/06/01 Servers