如何防止Python的urllib(2)遵循redirect

我目前正在尝试使用Pythonlogin到一个网站,但该网站似乎是在同一页面上发送一个cookie和一个redirect语句。 Python似乎是跟随这个redirect,从而阻止我读取login页面发送的cookie。 如何防止Python的urllib(或urllib2)urlopen跟随redirect?

你可以做几件事情:

  1. build立你自己的拦截每个redirect的HTTPRedirectHandler
  2. 创build一个HTTPCookieProcessor的实例并安装该开jar器,以便您可以访问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 

如果你所需要的只是停止redirect,那么有一个简单的方法来做到这一点。 例如,我只想获取cookie,并获得更好的性能,我不想被redirect到任何其他页面。 我也希望代码保持为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()

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

 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'] 

build_opener()调用了使用这个处理程序类列表的build_opener()

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

您可以尝试使用省略HTTPRedirectHandler的列表来自己调用urllib2.build_opener(handlers) ,然后对结果调用open()方法以打开您的URL。 如果你真的不喜欢redirect,你甚至可以调用urllib2.install_opener(opener)到你自己的非redirect开jar器。

这听起来像是你真正的问题是, urllib2不按你喜欢的方式做cookies。 另请参见如何使用Pythonlogin到网页并检索cookie以备后用?

这个问题在这之前被问过。

编辑:如果你不得不处理古怪的Web应用程序,你应该尝试机械化 。 这是一个伟大的图书馆,模拟一个网页浏览器。 你可以控制redirect,cookies,页面刷新…如果网站不依赖于JavaScript,你会很好地相处。