1. lorien
  2. grab
  3. Issues
Issue #88 resolved

Бесконечный редирект при follow_refresh=True

ruko
created an issue

На некотрых сайтах в теге meta с http-equiv="refresh" url часто указывает на тот же урл, что и при запросе. В результате происходит бесконечный редирект и вываливается питоновский RuntimeError: maximum recursion depth exceeded. Например:

import grab
g=grab.Grab(follow_refresh=True)
g.go(u'http://недвижимость55.рф/')

Предлагаю добавить в base.py проверку на последний url при meta refresh'e

# base.py

GLOBAL_STATE = {
    'request_counter': 0,
    'dom_build_time': 0,
    'refresh_last_url': '',
}

...
# в конце функции process_request_result
# TODO: check max redirect count
if self.config['follow_refresh']:
    url = find_refresh_url(self.response.unicode_body())
    if url and url != GLOBAL_STATE['refresh_last_url']:
        GLOBAL_STATE['refresh_last_url'] = url
        return self.request(url=url)

Comments (3)

  1. lorien repo owner

    Не думаю, что правильно будет прерывать цепочку редиректов, даже если адреса одни и те же встречаются в параметре редиректа. В грабе есть опция redirect_limit, добавил её поддержку и для refresh редиректов.

    Теперь после 10 редиректов (значение опции по-умолчанию) выпадает: grab.error.GrabTooManyRedirectsError

  2. Log in to comment