python重定向cookie_python urllib2 重定向时获取cookie

最近用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)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值