使用Mechanize(Python)获取重定向日志

时间:2012-03-14 13:02:16

标签: python mechanize mechanize-python

我想使用用Python编写的Mechanize来获取url重定向日志。例如,www.google.com - > www.google.co.in。之前在SO中已经提出了确切的问题,但它适用于Ruby

How to get redirect log in 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)的替代是什么?

3 个答案:

答案 0 :(得分: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/']

它应该比提供的WWW::Mechanize代码段快得多,因为urllib2只访问每个网址一次。

mechanize提供了urllib2功能的超集,即,如果您使用mechanize,则只需将urllib2上面的mechanize替换为{{1}},它就能正常工作

答案 1 :(得分:1)

如果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")

答案 2 :(得分:0)

我打算给你一个' IGIFY',但你是对的,机械化文档很糟糕。稍微调整一下,看起来你应该看看urllib2,因为mechanize暴露了整个界面。