python模拟登录爬虫 简书_python--爬虫(模拟登录)
1.爬取baidu
baidudemo.py
#!/usr/bin/python
#-- coding:gb18030 --
import urllib2
response = urllib2.urlopen("http://www.baidu.com")
print response.read()
urllib2.urlopen
(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
Open the URL url, which can be either a string or a Request object.
2.爬取baidu
#!/usr/bin/python
#-*- coding:gb18030 -*-
import urllib
import urllib2
request = urllib2.Request("http://www.baidu.com")
response = urllib2.urlopen(request)
print response.read()
class urllib2.Request
(url[, data][, headers][, origin_req_host][, unverifiable])
This class is an abstraction of a URL request.
url should be a string containing a valid URL.
data may be a string specifying additional data to send to the server, or None
3.模拟登录
firefox查看提交的表单
#!/usr/bin/python
#-*- coding:gb18030 -*-
import requests
data={"userBean.loginName":"admin","userBean.loginPass":"52f9001b1e75069f3c8c8daac9961b8a"}
s=requests.session()
#s.post(url='http://10.50.x.x/portal/login_init.action',data=data) #失败
s.post(url='http://10.50.x.x/admin/login_login.action',data=data)# 成功
r=s.get('http://10.50.x.x/admin/login_login.action')
print r.text
html信息
4.模拟登录
import urllib
import urllib2
values = {"userBean.loginName":"admin","userBean.loginPass":"52f9001b1e75069f3c8c8daac9961b8a"}
data = urllib.urlencode(values)
url = "http://10.50.x.x/admin/login_login.action"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print response.read()
urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。例如 字典{'name': 'dark-bull', 'age': 200}将被转换为"name=dark-bull&age=200"
成功爬去的html信息
5.带验证码的模拟登录:
思路:
a.先打开登陆页面,获得cookies。
b.再访问验证码的地址。验证码是动态的,每次打开都不一样。
c.识别验证码。这里就需要你处理、识别刚才得到的验证码。自己去找验证码(captcha)识别库,python可以用 pytesser(这个库是调用PIL来处理识别的) 、openc 之类的 或者可以人工识别然后手动输入验证码。
d.构造post请求数据(request data)和请求头部(request head) ,然后 将构造的请求 post给网站
f.获取 响应(response)信息,并通过测试来验证登陆是否成功。或者直接跳过a步骤:
参考:
key:
每次验证码都不同
CheckCode.aspx
返回码:200
编码问题:
输出:%D1%A7%C9%FA
正常登陆的过程
先Post 访问default3.aspx
然后再get访问xsmainfs.aspx?xh=xxxx
还需要再访问 xstop.aspx和xsleft.aspx
post数据到default3.aspx后会重定向到/xsmainfs.aspx?xh=xx
post数据到default3.aspx后会返回302状态码
同样去访问xsmainfs.aspx的时候也会返回302状态码,正常情况下应该是200
抓包观察:
post过去的数据
�第一次返回信息
get访问xsmainfs.aspx,带cookie
firefox debug
对比,就connection不同
xsmainfs返回302
302是什么?
302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个暂时重定向是一种服务器端的重定向,能够被搜索引擎蜘蛛正确地处理。
为什么返回302呢?
302不是错误, 是http code. 再header中, 会有Location: http://url.com, 告诉浏览器, 下一步的地址, 浏览器检测到后, 跳转到新地址http//url.com.
应该要返回200才对
模拟登陆成功:
返回200
返回200
接下类要获取个人信息的数据
get方式:
xsxx.aspx?xh=xx&xh1=xxx
获取网页
正则表达式提取数据
14055301xx
姓名
�出生日期
性别
入学日期
�民族
专业名称
专业方向
学院名称 班级名称
�身份证号 �年级 考生号
学制生源所在地
政治面貌
学籍状态
目标:
1.模块化
2.存入数据库
3.自动化识别验证码
google:python 正方教务系统
一堆。。。
302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
HTTPError是URLError的子类,在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。举个例子,假如response是一个”重定向”,需定位到别的地址获取文档,urllib2将对此进行处理。
其他不能处理的,urlopen会产生一个HTTPError,对应相应的状态吗,HTTP状态码表示HTTP协议所返回的响应的状态。下面将状态码归结如下:
还需要在代码里面添加访问xstop.aspx(带header和cookie)
以确定是否真正模拟登陆成功
urllib2.Request()
urllib2用一个Request对象来映射你提出的HTTP请求,在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,通过调用urlopen并传入Request对象,将返回一个相关请求response对象,这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。
urllib2.build_opener()
同样,可以使用build_opener,这是一个更加方便的函数,用来创建opener对象,他只需要一次函数调用。
build_opener默认添加几个处理器,但提供快捷的方法来添加或更新默认处理器。
其他的处理器handlers你或许会希望处理代理,验证,和其他常用但有点特殊的情况。
install_opener 用来创建(全局)默认opener。这个表示调用urlopen将使用你安装的opener。
Opener对象有一个open方法。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
