我想使用用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)的替代是什么?
答案 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暴露了整个界面。