2

Pythonで書かれたMechanizeを使ってURLリダイレクトログを取得したいです。たとえば、www.google.com --> www.google.co.in. 正確な質問はSOで以前に尋ねられましたが、Ruby用です

Mechanizeでリダイレクトログを取得するには?

答えは、これを行うにはRubyで次のことができることを説明しています-

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を使って同じことをしたいと思っています。何か助けはありますか?Python for Mechanizeのget(url)の代替は何ですか?

4

3 に答える 3

1

jf sebastian の回答は、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")
于 2012-04-23T20:29:38.537 に答える
1

私はあなたに「IGIFY」を与えるつもりでしたが、あなたは正しいです。少し調べてみると、mechanize はそのインターフェース全体を公開しているため、urllib2 を見る必要があるようです。

于 2012-03-14T13:39:04.863 に答える
1

メソッドをオーバーライドHTTPRedirectHandler.redirect_request()して、リダイレクト履歴を保存できます。

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

は各 URL に 1 回しかアクセスしないWWW::Mechanizeため、提供されたコード スニペットよりもはるかに高速です。urllib2

mechanize機能のスーパーセットを提供します。urllib2つまり、使用する場合は、上記mechanizeの出現箇所をすべて置き換えるだけで機能します。urllib2mechanize

于 2012-03-14T14:41:07.033 に答える