2009-02-16 69 views
43

我目前正在嘗試使用Python登錄到一個站點,但該站點似乎是在同一頁面上發送cookie和重定向語句。 Python似乎在跟蹤重定向,從而阻止我閱讀登錄頁面發送的cookie。如何防止Python的urllib(或urllib2)從重定向後urlopen?如何防止Python的urllib(2)跟隨重定向

+0

杜plicate:http://stackoverflow.com/questions/110498/is-there-an-easy-way-to-request-a-url-in-python-and-not-follow-redirects/110808 – 2009-02-16 20:56:42

+0

一個類似的問題: http://stackoverflow.com/questions/9890815/python-get-headers-only-using-urllib2 – newtover 2012-03-28 11:28:47

回答

33

你可以做兩件事情:

  1. 構建自己化HTTPRedirectHandler截取每個重定向
  2. 創建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 
+0

你在這個例子中似乎沒有使用`redirect_handler = urllib2.HTTPRedirectHandler()`。你打算展示第二個例子嗎? – 2011-08-16 21:13:06

11

urllib2.urlopen調用build_opener()它使用處理類名單:

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

你可以嘗試一下,它省略HTTPRedirectHandler列表調用urllib2.build_opener(handlers),然後調用結果的open()方法來打開你的網址。如果你真的不喜歡重定向,你甚至可以撥打urllib2.install_opener(opener)給你自己的非重定向開叫者。

聽起來像你真正的問題是,urllib2不按你喜歡的方式做餅乾。另請參見參考How to use Python to login to a webpage and retrieve cookies for later usage?

+6

*你可以嘗試使用一個省略HTTPRedirectHandler的列表來自己調用urllib2.build_opener(處理程序),然後調用open()方法在結果打開你的URL。*好吧,文檔爲urllib2。build_opener()說*下面的類**的實例將在處理程序**之前,除非處理程序包含它們,它們的實例或它們的子類:ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler,HTTPRedirectHandler,FTPHandler,FileHandler ,HTTPErrorProcessor。*它看起來像忽略'HTTPRedirectHandler`將不起作用... – 2011-04-01 17:57:53

3

here之前被問道此問題。

編輯:如果你不得不處理古怪的web應用程序,你應該試試mechanize。這是一個很棒的圖書館,可以模擬網絡瀏覽器。你可以控制重定向,cookies,頁面刷新......如果網站不依賴於JavaScript,你會很好地與機械化相處。

28

如果你需要的是停止重定向一個快速的小東西,然後有一個簡單的方法來做到這一點。例如,我只想獲取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']