当前位置:  开发笔记 > 编程语言 > 正文

如何防止Python的urllib(2)遵循重定向

如何解决《如何防止Python的urllib(2)遵循重定向》经验,为你挑选了3个好方法。

我目前正在尝试使用Python登录网站,但该网站似乎在同一页面上发送cookie和重定向语句.Python似乎遵循该重定向,从而阻止我阅读登录页面发送的cookie.如何防止Python的urllib(或urllib2)urlopen跟随重定向?



1> pope..:

你可以做几件事:

    构建自己的HTTPRedirectHandler,拦截每个重定向

    创建一个HTTPCookieProcessor实例并安装该开启器,以便您可以访问cookiejar.

这是一个显示两者的快速小事

import urllib2

#redirect_handler = urllib2.HTTPRedirectHandler()

class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
    def http_error_302(self, req, fp, code, msg, headers):
        print "Cookie Manip Right Here"
        return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)

    http_error_301 = http_error_303 = http_error_307 = http_error_302

cookieprocessor = urllib2.HTTPCookieProcessor()

opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor)
urllib2.install_opener(opener)

response =urllib2.urlopen("WHEREEVER")
print response.read()

print cookieprocessor.cookiejar



2> Alan Duan..:

如果您只需要停止重定向,那么有一种简单的方法可以做到这一点.例如,我只想获取cookie并获得更好的性能,我不希望被重定向到任何其他页面.我也希望代码保持为3xx.我们以302为例.

class MyHTTPErrorProcessor(urllib2.HTTPErrorProcessor):

    def http_response(self, request, response):
        code, msg, hdrs = response.code, response.msg, response.info()

        # only add this line to stop 302 redirection.
        if code == 302: return response

        if not (200 <= code < 300):
            response = self.parent.error(
                'http', request, response, code, msg, hdrs)
        return response

    https_response = http_response

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), MyHTTPErrorProcessor)

这样,你甚至不需要进入urllib2.HTTPRedirectHandler.http_error_302()

更常见的情况是我们只想停止重定向(根据需要):

class NoRedirection(urllib2.HTTPErrorProcessor):

    def http_response(self, request, response):
        return response

    https_response = http_response

通常以这种方式使用它:

cj = cookielib.CookieJar()
opener = urllib2.build_opener(NoRedirection, urllib2.HTTPCookieProcessor(cj))
data = {}
response = opener.open('http://www.example.com', urllib.urlencode(data))
if response.code == 302:
    redirection_target = response.headers['Location']



3> joeforker..:

urllib2.urlopenbuild_opener()使用此处理程序类列表的调用:

handlers = [ProxyHandler, UnknownHandler, HTTPHandler,
HTTPDefaultErrorHandler, HTTPRedirectHandler,
FTPHandler, FileHandler, HTTPErrorProcessor]

您可以尝试urllib2.build_opener(handlers)使用省略的列表调用自己HTTPRedirectHandler,然后open()在结果上调用方法以打开您的URL.如果你真的不喜欢重定向,你甚至可以打电话urllib2.install_opener(opener)给你自己的非重定向开启者.

这听起来像你真正的问题是urllib2没有按照你想要的方式做饼干.另请参阅如何使用Python登录网页并检索cookie以供以后使用?


*您可以尝试使用省略HTTPRedirectHandler的列表自己调用urllib2.build_opener(处理程序),然后在结果上调用open()方法打开您的URL.*嗯,urllib2.build_opener()的文档说这个*实例以下类**将位于处理程序**之前,除非处理程序包含它们,它们的实例或它们的子类:ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler,HTTPRedirectHandler,FTPHandler,FileHandler,HTTPErrorProcessor.*它看起来像是在忽略` HTTPRedirectHandler`将无法正常工作......
推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有