最新消息:

python模拟登陆登陆二:获取和处理发送post request和head数据

python admin 7969浏览 0评论

上篇文章《python模拟登陆登陆一:验证码与cookies的同步处理思路》 ,我验证了下自动登录的过程,以cookies与验证码如何同步的问题。

今天这篇文章说下如何获取和处理发送post request和head数据。

工具:

firefox浏览器及firebug插件。

(其他的如httpfox,live http head   ,fiddler,httpwatch  也行)

1.查看分析登陆页面html代码,看是否有iframe

我们写一个自动登录的脚本的时候,先要分析出需要post request和head数据,以及post的网址等。这里,我们先打开firebug开始监控,然后打开网站的登陆页面http://zhuzhou2013.feixuelixm.teacher.com.cn/IndexPage/Index.aspx 。用firebug查看页面的html代码,发了输入账号和密码的那个登陆窗口居然是个iframe 。其实,在第一篇文章的时候,有经验的就会发现post的url地址与登陆的url太不 一样了 。我自己也因为懒得查看源码和分析,直接写了,运行的时候,其实已经登陆进去了,但是因为是python脚本返回的网页html代码里iframe不会出现,所以总司验证失败,以为自己代码有问题。所以,建议写之前先分析网页是否有iframe ,这样可以减少步骤和代码。 我这里就当做自己没分析出源登陆地址,还是在http://zhuzhou2013.feixuelixm.teacher.com.cn/IndexPage/Index.aspx  这个地址来获得post的数据。

2.输入密码登陆网站,查看post的数据和head

登陆网站,我们可以通过firebug的“网络(network)”,找到我们所需要的post的地址和request及response数据。如下图在头信息中我们能看到post request head  和  response head  的信息,见图一:

post的地址:http://zhuzhou2013.feixuelixm.teacher.com.cn/GuoPeiAdmin/Login/Login.aspx

headinfo2

在post中,我们能看到post所需要的数据,如下图2(账户和密码我都去掉了):

postdata3

可见,在post  request head(请求头信息)中,需要调用cookies的值。而我们打开网站登录页面,准备登陆的时候,会获得很多cookies,可以从firebug中“cookies”标签中看到,有下面一些cookies,如图3:

lotcookies4

这么多cookies,那些才是需要的呢.?

这个很简单,firebug既有查看cookies的功能,又有删除cookies的功能,在某个cookies上单击鼠标右键,选择删除  。然后再登陆,如果删除的这个cookies不是必须的,那么我们就能登陆成功。如此重复,就知道哪些是必须的。这里说下,如果cookies的域都不是我们要登陆的网站的url,那么可以肯定这个cookies不是必须的,如上图中的,looyu_id ,looyu_23945  。

同理,post的 request head 有部分也是不需要的,如X-FireLogger,x-kn-appId,x-fsn,x-Firelogger等,都是不必要的的,因为这个既可能是网站估计迷惑我们,也有可能是网页其他元素干扰的。这些也可以通过排除法来,写代码来测试。当然,一般开始写都尽量全部写。

其实,我们还可以先屏蔽一些网页上无关的页面元素,用abp直接屏蔽doyoo.net 和looyu.net  两个域名,同时屏蔽了这两个网站的cookies。这样,我们就不会受这两个网站的cookies的误导,然后测试登陆,可以一次测试就排除多个cookies,减少时间和步骤。

post request head还有一个麻烦的地方,就是它包含了cookies的值,见图1 。这就需要我们对cookiejar的值进行处理,因为cookiejar的格式不符合要求,cookiejar格式如下:

<_MozillaCookieJar.MozillaCookieJar[<Cookie .ASPXANONYMOUS=vLho9JXszwEkAAAAODc4NTcwYTQtYWFiNy00Mzg5LThkNzEtNjYxYjcxNmM3Nzdk-H-RHMNhr0fVc7UTHulz8qUfBOU1 for zhuzhou2013.feixuelixm.teacher.com.cn/>, <Cookie ASP.NET_SessionId=reg0ik55hffagzjabwo3xu45 for zhuzhou2013.feixuelixm.teacher.com.cn/>, <Cookie feixuelixmweb=r-feixuelixm_7.86 for zhuzhou2013.feixuelixm.teacher.com.cn/>]>

而post request head中 “Cookie”  的值则为下面的格式:

cookies: .ASPXANONYMOUS=vLho9JXszwEkAAAAODc4NTcwYTQtYWFiNy00Mzg5LThkNzEtNjYxYjcxNmM3Nzdk-H-RHMNhr0fVc7UTHulz8qUfBOU1;ASP.NET_SessionId=reg0ik55hffagzjabwo3xu45;feixuelixmweb=r-feixuelixm_7.86

所以要使用下面的代码处理:

#打印未处理的过的cookies
 
print cookiejar
 
cookies = ''
 
#打印每个cookies的项目和值,整理格式
 
for index, cookie in enumerate(cookiejar):
 
print '[',index, ']';
 
print cookie.name;
 
print cookie.value;
 
print "###########################"
 
cookies = cookies+cookie.name+"="+cookie.value+";";
 
print "###########################"
 
cookie = cookies[:-1]
 
#打印整理的好的cookie
 
print "cookies:",cookie

所以头部请求是:

headers = {
 
    'Accept' :'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
 
    'Accept-Language': 'zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3',
 
    'Accept-Encoding': 'gzip, deflate',
 
    'Host':    'zhuzhou2013.feixuelixm.teacher.com.cn',
 
    'Cookie':cookies,
 
    'User-Agent' : 'Mozilla/5.0 (Windows NT 5.1; rv:29.0) Gecko/20100101 Firefox/29.0',
 
    'Referer' : 'http://zhuzhou2013.feixuelixm.teacher.com.cn/GuoPeiAdmin/Login/Login.aspx',
 
    #'Content-Type':'application/x-www-form-urlencoded',
 
    #'Content-Length' :474,
 
    'Connection' : 'Keep-Alive'
 
}

开始构造post请求头部,post的数据中要求有验证码,这里验证码使用第一篇中的方法来得到为text 。

然后,post的数据中,有些东西的值是不会变的,比如:__EVENTTARGET ,_EVENTARGUMENT,__VIEWSTATE 。这些就要自己观察和对比后才知道。

#用户名,密码
 
username = "XXXXXXXXXXXXx"
 
password = "YYYYfasdfas"
 
 
 
postData = {
 
    '__EVENTTARGET':'',
 
    '__EVENTARGUMENT':'',
 
    '__VIEWSTATE': '/wEPDwUKLTcyMzEyMTY2Nw8WAh4LTG9naW5lZFBhZ2UFEExvZ2luZWRQYWdlLmFzcHgWAmYPZBYCZg8PZBYGHgV0aXRsZQUg55So5oi35ZCNL+WtpuS5oOeggS/ouqvku73or4Hlj7ceB29uZm9jdXMFEGNoZWNrSW5wdXQodGhpcykeBm9uYmx1cgUNcmVzdG9yZSh0aGlzKWQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFC0ltZ2J0bkxvZ2luckJjpNhrusWhtPuT33UJ1dBUkvw=',
 
    'txtUserName':username,
 
    'txtPassWord':password,    
 
    'txtCode':text,
 
    'ImgbtnLogin.x':44 ,
 
    'ImgbtnLogin.y':14,
 
    'ClientScreenWidth':1180
 
}

3.发送post请求

然后,将构造好的post的数据及头部整合成一个post request请求,然后发送请求:

#合成post数据
 
data = urllib.urlencode(postData)    
 
print "data:###############"
 
print  data
 
#创建request
 
#构造request请求
 
request = urllib2.Request(  PostUrl,data,headers  )
 
try:
 
    #访问页面
 
    response = urllib2.urlopen(request)
 
    #cur_url =  response.geturl()
 
    #print "cur_url:",cur_url
 
    status = response.getcode()
 
    print status
 
except  urllib2.HTTPError, e:
 
     print e.code
 
#将响应的网页打印到文件中,方便自己排查错误
 
#必须对网页进行解码处理
 
f= response.read().decode("utf8")
 
outfile =open("rel_ip.txt","w")
 
print >> outfile , "%s"   % ( f)
 
#打印响应的信息
 
info = response.info()
 
print info

 

4.检验是否登录成功

正如刚才你说的,因为返回网页(http://zhuzhou2013.feixuelixm.teacher.com.cn/IndexPage/Index.aspx)有iframe ,所以我们不能抓取到我们要的字符串(返回的网页html代码在rel_ip.txt 文件中,我们是看不到iframe中的内容的)

我们可以直接去一个没有iframe的,又包含可以验证我们登陆成功的字符串的网页,也就是iframe源网站 :

#测试登陆是否成功,因为在testurl只有登陆后才能访问
 
​#还有一个原因是因为post返回得到的网页中含有iframe ,而要搜索的信息刚好在iframe ,所以要去iframe的原来的地址验证
 
testurl = "http://zhuzhou2013.feixuelixm.teacher.com.cn/GuoPeiAdmin/Login/LoginedPage.aspx"
 
try:
 
    response = urllib2.urlopen(testurl)
 
except  urllib2.HTTPError, e:
 
     print e.code
 
#因为后面要从网页查找字符来验证登陆成功与否,所以要保证查找的字符与网页编码相同,否则无非得到正确的结论。建议用英文查找,如css中的 id, name 之类的。
 
f= response.read().decode("utf8").encode("utf8")
 
outfile =open("out_ip.txt","w")
 
print >> outfile , "%s"   % ( f)
 
#在返回的网页中,查找“你好” 两个字符,因为只有登陆成功后才有两个字,找到了即表示登陆成功。建议用英文
 
tag = '你好'.encode("utf8")
 
if  re.search( tag,f):
 
    #登陆成功
 
    print 'Logged in successfully!'
 
else:
 
    #登陆失败
 
    print 'Logged in failed, check result.html file for details'
 
response.close()
 
#这个代码很随意,但是容易看,需要的活,可以写成函数。还有就是urlopen()在大量登陆及检验过程中,可能read(0因为网络阻塞而timeout(超时) ,需要设置urlopen() 的超时时间,或者多次发送请求

#######################################################

教程玩!!

麻痹的,最烦python的缩进作为语法的设定,好蛋疼,无论是粘贴复制代码,还是在编辑器中写代码,是不是就被缩进没对齐。而且粘贴代码是,一旦缩进打乱了,这代码算还要自己去重新整理。写的时候也不爽,还是没有C那样随便。

转载请注明:爱开源 » python模拟登陆登陆二:获取和处理发送post request和head数据

您必须 登录 才能发表评论!