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常用的日期时间处理方法示例
Feb 08 Python
flask入门之表单的实现
Jul 18 Python
Python中的 is 和 == 以及字符串驻留机制详解
Jun 28 Python
python使用百度文字识别功能方法详解
Jul 23 Python
python django 原生sql 获取数据的例子
Aug 14 Python
python检测服务器端口代码实例
Aug 31 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
Feb 28 Python
python实现邮件循环自动发件功能
Sep 11 Python
python与c语言的语法有哪些不一样的
Sep 13 Python
python如何利用paramiko执行服务器命令
Nov 07 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 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
第一个无线电台是由谁发明的
2021/03/01 无线电
PHP 已经成熟
2006/12/04 PHP
浅析php学习的路线图
2013/07/10 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
Symfony2安装的方法(2种方法)
2016/02/04 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
JObj预览一个JS的框架
2008/03/13 Javascript
学习ExtJS table布局
2009/10/08 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
js关于命名空间的函数实例
2015/02/05 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
简单纯js实现点击切换TAB标签实例
2015/08/23 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
javascript如何创建对象
2016/08/29 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
2019/04/24 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
python映射列表实例分析
2015/01/26 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python对文件操作知识汇总
2016/05/15 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
Python urllib3软件包的使用说明
2020/11/18 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
SIMON MILLER官网:洛杉矶的生活方式品牌
2020/10/19 全球购物
小学生竞选班干部演讲稿
2014/04/24 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
机关干部个人对照检查材料思想汇报
2014/09/28 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
联村联户简报
2015/07/21 职场文书
redis 限制内存使用大小的实现
2021/05/08 Redis