python爬虫模拟登陆urllib2重定向问题?

查看:96
本文介绍了python爬虫模拟登陆urllib2重定向问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

这几天尝试用python模拟登陆,用的是urllib2库,在网上学了一个人人网登陆的,就是post数据到action页面,拿到cookie,然后再用这个cookie访问主页,感觉很简单,也没有关注背后的细节,但是我又用这个套路模拟登陆我们学校的一个网站时却出了问题,同样的步骤,最后却不能访问登陆后的页面,我查看了中间的过程,用wireshark比较了模拟登陆和正常登陆的区别

下文中:
登录页面:需要输入用户名和密码的界面
action页面:form表单提交的页面
主页:登陆成功后的主页

正常手动登陆时:

在浏览器中手动输入用户名密码,登陆成功,报文:

报文1发送一个post请求,请求中携带用户名密码,和cookie,

cookie为浏览器打开登陆页面后立刻得到的:

一条是无名cookie,值是10006(总是这个值),一条PHPSESSID

报文2应答302,给了一个地址是/cloud/studentindex.php?type=booking,这个地址即是登陆成功后的主页,这时已经登陆成功了
报文3请求这个新地址,第四条报文应答主页的html内容

用urllib2的脚本登陆:

代码:

    cj = cookielib.CookieJar()
    opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  
    opener.addheaders = [('User-agent','Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0')]  
    data = urllib.urlencode({"studentno":user,"studentpassword":password,"btnlogin":"登  录"})        
    opener.open("http://202.112.131.80/cloud/index.php?type=student",data)
    op=opener.open("http://202.112.131.80/cloud/studentindex.php?type=booking") 

(代码中user和password是字符串)

报文(登录失败):

报文1向action页面发送用户名和密码,
报文2返回302应答,重定向的地址还是登陆页面。应答中的cookie:

报文3是urllib2自动带cookie重定向,访问登陆页面
报文4应答访问成功
报文5是尝试访问主页,结果直接被重定向到loginout,没有登录成功

上面这些请求报文,每次都带着cookie,但是只有PHPSESSID一项,没有10006那项
我手动登陆就有10006cookie,用urllib2就没有

查看了网页源码,有一句:

然后我自己把10006手动加入cookie,也登录失败

我还尝试了用httplib2,先GET访问登录界面,但是得到的cookie也没有10006这项。我手动加入10006,再POST了action页面,还是登录失败

网上有人说urllib2重定向丢失cookie,其实并没有,我在登陆人人的时候用wireshark看过了,正常手动登陆直接就能上,脚本登陆需要几次重定向,但每次都是自带cookie,而且最后登陆成功了。

说了这么多,我有几个问题:
1、为什么手动登录重定向很少,脚本登录会有重定向?
2、为什么一样的步骤,人人能登录上,学校的那个网站不行?
3、为什么手动登陆的cookie是PHPSESSID和10006,但是脚本得到的是PHPSESSID和path?
4、为什么能有名称是空的cookie?新建cookie名是不能为空的,除非用字符串新建,自动解析。而且10006这个cookie有个参数叫路径,值是/cloud,这个信息有用吗

python小白一枚,大家帮个忙啊。在网上查了好几天没找到解决方法,随便说几句也行,我现在实在不知道问题出在哪了。要是需要其他更详细的信息,可以问我。

解决方案

这个问题我已经解决了,是服务器那边的逻辑问题,我又仔细看了看报文和cookie试出来的。大概的意思我猜测,他要求访问action页面时,必须带上访问登录页面时给的cookie,我在原来代码(就是上面贴出的代码)中加了一行,先访问登陆页面(得到cookie),问题就解决了,后来发现那个10006也不是必须的……代码在最下面

重定向那个问题,不仅是登录成功后重定向到主页。如果是手动登录,基本就重定向一次,从登录页面到主页;但是脚本的话,中间要访问别的网页(好像也是登录界面),跳几个页面后才转到主页,我猜测可能是某些参数与手动登录不一致,服务器为了安全性,因为脚本重定向到的中间网页好多带有secure之类单词

还有httplib这个感觉有些奇怪,有时候自动跟踪重定向,有时候不跟踪……

header这个,爬一些简单网站的时候,比如学校的什么什么,基本上带个user-agent就行了……

成功的代码:

    cj = cookielib.CookieJar()
    opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  
    opener.addheaders = [('User-agent','Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0')]  
    data = urllib.urlencode({"studentno":user,"studentpassword":password,"btnlogin":"登  录"})
    opener.open("http://202.112.131.80/cloud/index.php")
    opener.open("http://202.112.131.80/cloud/index.php?type=student",data)
    op=opener.open("http://202.112.131.80/cloud/studentindex.php?type=booking")

这篇关于python爬虫模拟登陆urllib2重定向问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆