python标记跳转_python urllib2 拦截301/302跳转,处理cookie,获取跳转的新url

这篇博客介绍了如何在Python中处理HTTP的301和302重定向,同时处理Cookie。通过自定义`MyRedirectHandler`类拦截跳转,并根据需要的host进行处理。代码示例展示了如何获取新的URL,以及在遇到Set-Cookie头时如何处理和合并Cookie。
摘要由CSDN通过智能技术生成

一个项目遇到302,需要处理cookie并且获取302后的url,虽然方向错了,但是还是记录下代码吧。

class MyRedirectHandler(urllib2.HTTPRedirectHandler): #自定义跳转类

class retval:  #兼容数据获取

def __init__(self):

self.newurl = ”

self.httpcode = 0

self.headers = ”

def getcode(self): #获取http状态码,可以根据状态码处理跳转

return self.httpcode

def read(self): #原版函数是读取html的,这里用来返回url

return self.newurl

def http_error_302(self, req, fp, code, msg, headers): #具体拦截函数了

if req.get_host().find(‘www.526net.com’) > -1: #这里我是针对性拦截的,所以取了host然后判断了一下

newret = self.retval()     #下面就是给上面的变量赋值,方便读取

newret.httpcode = 302

newret.headers = headers

if headers.has_key("Location"):

newret.newurl = headers["Location"]

return newret

else:

return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers) #如果主机不是我需要的,交回给系统默认函数处理。也就是不拦截。

opener = urllib2.build_opener(MyRedirectHandler,cookieHandler, proxyhandlers) #后两个参数如其名,cookie和代理 可以根据自己需求删除,拦截跳转主要是第一个参数。

httpcode = resp.getcode()  #获取http返回的状态码

data = gzipper.read()       #返回301后的url,请看上面注释

header = str(resp.headers) # 返回头部信息

return {‘code’: httpcode, ‘header’: header, ‘html’: data} #这是我自己返回的数据,其实也就是上面三个东西。

处理cookie 我是在别人代码基础上修改过的,已经记不得原作者网址了,感谢他的分享。

def http_error_302(self, req, fp, code, msg, headers):

cookiemap = {}

newcookie = ”;

setcookie = str(headers["Set-Cookie"])    #获取cookie 写cookie 都是通过返回头部的set-cookie 完成的

cookieTokens = ["domain", "expires", "path", "max-age" ,"version","secure"]  #需要跳过的cookie字段

tokens = setcookie.split(";")

for cookie in tokens:

cookie = cookie.strip()

if cookie.lower().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.lower() not in cookieTokens:

cookiemap[name] = value

newcookie += name +’='+value+’;’

cookiesstr = req.get_header(‘Cookie’,”)  # 这里是我项目需要,获取请求的cookie,在下面可以 合并 cookie

req.add_header("Cookie", newcookie)  #在头部添加 cookie 字段

return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers) #交还给系统处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值