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

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

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

正常手动登陆时:

在浏览器中手动输入用户名密码,登陆成功,报文:
clipboard.png
报文1发送一个post请求,请求中携带用户名密码,和cookie,

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

一条是无名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是字符串)

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

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

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

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

然后我自己把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")

回答:

先草草的给个建议,用 requests 库会比 urllib2 舒服的多。社区目前都是用 requests 的。

  1. 为什么手动登录,重定向很少?
    这个应该是错觉,登录完之后总是要重定向到某个网页。无论你是否登录成功
  2. 为什么一样的步骤,能登录人人,学校的不能?
    系统不一样,服务端验证逻辑不一定一样。当然不能把...
  3. cookie 10006 的问题
    你也看到了,那个 cookie 是网页的 js 代码给你设置的。但是你的程序又不能解析 js,所以当然就没有了。
  4. 为什么 cookie 名称可以是空的?
    这里有讲:https://developer.mozilla.org...

你这个模拟登陆的代码存在的问题可能会比较多...比如你这个没有设置 header(referer 字段等)。可能会被服务端直接拦截掉...

建议换成 requests,一方面资料多很多,这个 urllib2 库,就算是 python 老手也不一定记得这个库的用法,因为它真的很难用。

用了 requests 之后还有问题,可以在提出来,大家一起看看

回答:

就用 requests 吧,urllib2太老了

以上是 python爬虫模拟登陆urllib2重定向问题? 的全部内容, 来源链接: utcz.com/a/164146.html

回到顶部