Используйте Mechanize (Python), чтобы получить журнал перенаправления.

Я хочу получить журнал перенаправления URL-адресов с помощью Mechanize, написанного на Python. Например, 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. Любая помощь? Какова альтернатива get (url) в Python для Mechanize?


person anu.agg    schedule 14.03.2012    source источник


Ответы (3)


Вы можете переопределить метод 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, просто замените каждое вхождение urllib2 выше на mechanize, и все заработает.

person jfs    schedule 14.03.2012

Я собирался дать вам «IGIFY», но вы правы, механизировать документацию — отстой. Немного поковырявшись, похоже, вам следует взглянуть на urllib2, так как mechanize предоставляет весь этот интерфейс.

person Silas Ray    schedule 14.03.2012
comment
использование urllib2 не поможет, так как я хочу имитировать поведение браузера с помощью mechanize. - person anu.agg; 14.03.2012
comment
wwwsearch.sourceforge.net/mechanize/documentation.html Они прямо говорят, посмотрите на urllib2 документацию несколько раз на этой странице. - person Silas Ray; 14.03.2012

Ответ 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")
person user926321    schedule 23.04.2012