一个项目遇到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) #交还给系统处理