2012-03-14 12 views
2

Pythonで書かれたMechanizeを使用してURLリダイレクトログを取得します。たとえば、www.google.com - > www.google.co.inのようになります。正確な質問は、SOで前に頼まれましたが、それは答えはこの1つはRubyで次の操作を行うことができます行うことと説明しているRubyのMechanize(Python)を使用してリダイレクトログを取得する

How to get redirect log in Mechanize?

のためである -

for m.redirection_limit in 0..99 
    begin 
    m.get(url) 
    break 
    rescue WWW::Mechanize::RedirectLimitReachedError 
     # code here could get control at 
     # intermediate redirection levels 
    end 
end 

私がやりたいですPythonを使用して同じ。どんな助け? MechanizeのためのPythonのget(url)の代替は何ですか?

答えて

1

あなたは、リダイレクト履歴を保存するためにHTTPRedirectHandler.redirect_request()メソッドをオーバーライドすることができます:それははるかに高速ためurllib2訪問各URL回のみ提供さWWW::Mechanizeコードスニペットよりもあるべき

import urllib2 

class HTTPRedirectHandler(urllib2.HTTPRedirectHandler): 
    def redirect_request(self, req, fp, code, msg, headers, newurl): 
     newreq = urllib2.HTTPRedirectHandler.redirect_request(self, 
      req, fp, code, msg, headers, newurl) 
     if newreq is not None: 
      self.redirections.append(newreq.get_full_url()) 
     return newreq 

url = 'http://google.com' 

h = HTTPRedirectHandler() 
h.max_redirections = 100 
h.redirections = [url] 
opener = urllib2.build_opener(h) 
response = opener.open(url) 
print h.redirections 
# -> ['http://google.com', 'http://www.google.com/', 'http://google.com.ua/'] 

mechanizeは、あなたがmechanizeを使用している場合、すなわち、そしてちょうどmechanizeして上にurllib2のすべての発生を置き換え、それが動作しますurllib2機能のスーパーセットを提供します。

+0

ありがとう!これは完璧に正常に動作します –

0

私はあなたに「喜んで」与えようとしていましたが、あなたは正しいです。ちょっとポンコリすると、urllib2を見てみると、mechanizeがそのインターフェイス全体を公開しているように見えます。

+1

urllib2を使用すると、mechanizeを使用してブラウザの動作をシミュレートしたいので、役に立たないでしょう。 –

+0

http://wwwsearch.sourceforge.net/mechanize/documentation.html彼らは、そのページでurllib2のドキュメントを何度も見ていると明言しています。 –

1

j.fセバスチャンの回答は、httpリダイレクトの場合に効果的ですが、javascriptリダイレクトの場合は失敗します。 (urllib2はjavascriptのリダイレクトを処理しませんが、Mechanizeは行いません)

これはどちらのタイプのリダイレクトでも機能します。

import mechanize 
import logging 
import sys 
logger = logging.getLogger("mechanize") 
logger.addHandler(logging.StreamHandler(sys.stdout)) 
logger.setLevel(logging.INFO) 

browser = mechanize.Browser() 
browser.set_debug_redirects(True) 

r=browser.open("http://google.com") 
関連する問題