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简单实现获取当前时间
Aug 27 Python
基于Python的文件类型和字符串详解
Dec 21 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
python实现音乐下载器
Apr 15 Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 Python
python3获取url文件大小示例代码
Sep 18 Python
Python : turtle色彩控制实例详解
Jan 19 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
详解Python为什么不用设计模式
Jun 24 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
收音机史话 - 1960年代前后的DIY
2021/03/02 无线电
微信封装的调用微信签名包的类库
2017/06/08 PHP
Laravel框架实现利用中间件进行操作日志记录功能
2018/06/06 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
JavaScript 轮播图和自定义滚动条配合鼠标滚轮分享代码贴
2016/10/28 Javascript
JavaScript中匿名函数的递归调用
2017/01/22 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
基于Swiper实现移动端页面图片轮播效果
2017/12/28 Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
2018/01/13 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
JS实现的简单折叠展开动画效果示例
2018/04/28 Javascript
vue3.0 CLI - 3.2 路由的初级使用教程
2018/09/20 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
python实现socket端口重定向示例
2014/02/10 Python
跟老齐学Python之一个免费的实验室
2014/09/14 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
Python中关于使用模块的基础知识
2015/05/24 Python
使用Python从有道词典网页获取单词翻译
2016/07/03 Python
Django内容增加富文本功能的实例
2017/10/17 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
2018/04/28 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
Python实例方法、类方法、静态方法的区别与作用详解
2019/03/25 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
2019/08/31 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
餐饮营销方案
2014/02/23 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis