如何防止Python的urllib(2)遵循redirect
我目前正在尝试使用Pythonlogin到一个网站,但该网站似乎是在同一页面上发送一个cookie和一个redirect语句。 Python似乎是跟随这个redirect,从而阻止我读取login页面发送的cookie。 如何防止Python的urllib(或urllib2)urlopen跟随redirect?
你可以做几件事情:
- build立你自己的拦截每个redirect的HTTPRedirectHandler
- 创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,你会很好地相处。