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

我本来打算给你一个“IGIFY”,但你是对的,机械化文档很烂。稍微戳了一下,看起来你应该看看 urllib2,因为 mechanize 暴露了整个接口。

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

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

mechanize提供了一个超集的urllib2功能,即,如果你使用,那么只需将上面的mechanize每个出现替换为它就可以工作。urllib2mechanize

于 2012-03-14T14:41:07.033 回答
1

如果它们是 http 重定向,jf sebastian 的答案会很好,但如果它们是 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 回答