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

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

发表评论

您的电子邮箱地址不会被公开。