最新消息:

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

Python 大步 22804浏览 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

图一

图一

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

postdata3

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

图三

图三

这么多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=vLho9JXszwEkAAAAODc4N

TcwYTQtYWFiNy00Mzg5LThkNzEtNjYxYjcxNmM3Nzdk-H-RHMNhr0fVc7UTHulz8qUfBOU1 for zhuz

hou2013.feixuelixm.teacher.com.cn/>, <Cookie ASP.NET_SessionId=reg0ik55hffagzjab

wo3xu45 for zhuzhou2013.feixuelixm.teacher.com.cn/>, <Cookie feixuelixmweb=r-fei

xuelixm_7.86 for zhuzhou2013.feixuelixm.teacher.com.cn/>]>

 

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

cookies: .ASPXANONYMOUS=vLho9JXszwEkAAAAODc4NTcwYTQtYWFiNy00Mzg5LThkNzEtNjYxYjcx

NmM3Nzdk-H-RHMNhr0fVc7UTHulz8qUfBOU1;ASP.NET_SessionId=reg0ik55hffagzjabwo3xu45;

feixuelixmweb=r-feixuelixm_7.86

 

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

 


所以头部请求是:

 

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

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

 

 


3.发送post请求

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

 

 

4.检验是否登录成功

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

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

 

 

 

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

教程玩!!

 

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

 

转载请注明:大步's Blog » python模拟登陆登陆二:获取和处理发送post request和head数据

  1. 楼主,请问ImgbtnLogin.x和ImgbtnLogin.y的值是怎么确定的?

    • 这个是用firebug分析登录请去得到的,然后通过多次测试,发现这个值可以是固定的,然后就可以直接编码了

      • 博主您好,我也是遇到了这个问题。刚才也测试了下,发现ImgbtnLogin.x和ImgbtnLogin.y的值并不是固定的啊,这在提交post表单时是必须的吗?如果必须,该怎么处理呢?谢谢您~~

  2. 博主 我在查看post数据的时候 发现在firebug里面post login闪现了一下就没有了 最后得到的只有一堆get。。。。请问是什么原因啊。。。我用的是另一个网站~

  3. 博主您好,跟ls问题类似,我刚测试了下,发现ImgbtnLogin.x和ImgbtnLogin.y并不是确定的,这些在构造post表单的时候都是必须的吗?如果必须,该怎么填写呢?最近抓取一个网站也遇到这个问题。谢谢您~

SiteMap