最近用python写一个简单的爬虫,在模拟网站登录时遇到问题,就是登录后紧跟着302重定向,这时候cookie获取没做好,就会登录失败。
网上找了很多文章,可能是因为python版本不同之类的原因吧,很多方法试了都没用。这里踏破铁鞋找到了可用的方案,记录一下,希望能帮到后来的朋友。
鉴于python的版本浆糊问题,这里声明下,我使用的python版本2.7.3,并且使用的是urllib2库。
解决这个问题,其实说起来很简单,就是要自己定义一个RedirectHandler,在创建opener的时候作为参数放进去。
cj = cookielib.LWPCookieJar() opener = urllib2.build_opener(MyRedirectHandler, urllib2.HTTPCookieProcessor(cj))
这里我还要记录cookie信息因此还使用了cookiejar。
现在难点就在于这个RedirectHandler如何重写了。
urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)
通过这样一句调用,默认的redirectHandler已经支持在发现302头部的时候自动跳转到新的location去。但问题是返回的response中缺少了前一个请求返回的cookie信息。因此重点是如何在redirect handle中把前一个请求的cookie设置到新的请求中去。
class MyRedirectHandler(urllib2.HTTPRedirectHandler): def http_error_302(self, req, fp, code, msg, headers): setcookie = str(headers["Set-Cookie"]) cookieTokens = ["Domain","Expires", "Path", "Max-Age"] tokens = setcookie.split(";") for cookie in tokens: cookie = cookie.strip() if cookie.startswith("Expires="): cookies = cookie.split(",", 2) if len(cookies) > 2: cookie = cookies[2] cookie = cookie.strip() else : cookies = cookie.split(",", 1) if len(cookies) > 1: cookie = cookies[1] cookie = cookie.strip() namevalue = cookie.split("=", 1) if len(namevalue) > 1: name = namevalue[0] value = namevalue[1] if name not in cookieTokens: cookiemap[name] = value newcookie = cookiestring(cookiemap) req.add_header("Cookie", newcookie) return urllib2.HTTPRedirectHandler.http_error_302( self, req, fp, code, msg, headers)
这里我处理cookie使用了比较土的方法手动解析的,各位如果有更好的方法也请不吝赐教。
重点其实就是那一句req.add_header(“Cookie”, newcookie),这里是从set-cookie中解析出cookie串后拼接成请求头填入req中,在接下来的一句调用默认handle的函数时请求头就会附有新的cookie信息了。
如此处理后的请求,返回后即可从response中读取出cookie信息
response = opener.open(request) cookies = cj.make_cookies(response, request)
11 comments on “python urllib2 重定向时获取cookie”
cookiemap和cookiestring没有定义
哈哈,没想到会有人看这个博客。
cookiemap就是普通的map啦,cookiestring这个函数是自己写的,把map内容写为cookie形式的字符串。如果需要我可以发邮件给你哈。
伟大的google引路而来,哈哈……
我也猜到是这样子的了,但自己太菜了还是出现错误了,最好发邮件给我吧,谢谢!(后台评论看得到我的邮箱的)
是否能发一份给我呢?? a.robot.n@gmail.com
我是python3 做的。 也是遇到这个问题。 如果你方便 加我QQ 81999678 一起探讨一下!~
收到评论了吗?发邮件给我吧,谢谢。
也能不能发份给我,多谢1142434162@qq.com
能发给我一份吗,我自己写了一个 出错了啊,多谢376637436@qq.com
请问,为什么我之后的请求,被重定向了,其实应该是200,结果是302了,求解
很常见的情况,服务器这样处理方便维护,在浏览器里面用户也不易感知到。
你用浏览器的“开发者模式”观察网络请求状态码,可以确认接口实际跳转过程;或者也可使月curl -I 命令,在命令行中比较方便。
不懂怎么搞,给我来一份完整的吧~~
上面忘记写我的邮箱了。。。:caiququ@gmail.com
Comments are closed.