Когда я использую запросы python для проверки сайта, если сайт перенаправляет меня на другую страницу, узнаю ли я?

Я имею в виду, что если я перейду на «www.yahoo.com/thispage», а yahoo настроил фильтр для перенаправления / thispage на / thatpage. Поэтому всякий раз, когда кто-то переходит на / эту страницу, он попадает на / эту страницу.

Если я использую httplib / requests / urllib, узнает ли он, что было перенаправление? Какие страницы с ошибками? Некоторые сайты перенаправляют пользователя на / errorpage всякий раз, когда страница не может быть найдена.


person iCodeLikeImDrunk    schedule 20.11.2012    source источник
comment
Какую проблему вы пытаетесь решить? Как ваш код работает неправильно? Если вы просто хотите знать о режимах ошибок, проверьте это поведение самостоятельно.   -  person Marcin    schedule 21.11.2012
comment
Проверьте stackoverflow.com/questions/554446/   -  person OneOfOne    schedule 21.11.2012
comment
@Marcin У меня есть огромный список (более 1000) URL-адресов, чтобы проверить, работают они или нет. Я случайным образом выбрал 40-50 из них для тестирования вручную, я вижу, что некоторые из них перенаправляются на страницу с ошибкой, когда страница не может быть найдена. Также я вижу, что многие URL-адреса были перенаправлены, потому что шаблон URL-адреса изменился, одни и те же имена просто написаны по-разному.   -  person iCodeLikeImDrunk    schedule 21.11.2012
comment
@OneOfOne, это похоже на то, что мне нужно, я проверю. Благодарность!   -  person iCodeLikeImDrunk    schedule 21.11.2012


Ответы (4)


С requests вы получаете список любых перенаправлений в атрибуте .history объекта ответа. Он возвращает список Python. Дополнительную информацию см. В документации.

person MikeHunter    schedule 20.11.2012
comment
Кстати, эта ссылка на документацию обновлена: requests.readthedocs.io / ru / master / user / quickstart / - person Jason Kao; 02.02.2020

Чтобы предотвратить запросы от следующих перенаправлений, используйте:

r = requests.get('http://www.yahoo.com/thispage', allow_redirects=False)

Если это действительно перенаправление, вы можете проверить целевое местоположение перенаправления в r.headers ['location'].

person yonilevy    schedule 20.11.2012

Принятый ответ - это правильный первый вариант, но в некоторых случаях, если сайт выполняет перенаправление с помощью метатега, у них также указывается каноническая ссылка после перенаправления. В этом примере позвольте мне попытаться запросить http://en.wikipedia.org/wiki/Google_Inc_Class_A из википедии, это URL-адрес, который перенаправляет.

>> request = requests.get('http://en.wikipedia.org/wiki/Google_Inc_Class_A')

Проверяю и:

>> request.history
[]

Альтернативой является попытка получить канонический URL-адрес, который, надеюсь, должен иметь то, на что вы были перенаправлены. (Обратите внимание, что я также использую BeautifulSoup)

>> soup = BeautifulSoup(request._content)
>> canonical = soup.find('link', {'rel': 'canonical'})
>> canonical['href']
'http://en.wikipedia.org/wiki/Google'

Что действительно соответствует URL-адресу, на который вы перенаправляетесь в данном конкретном случае. Чтобы было ясно, это уродливый второй вариант, но его стоит попробовать, если все остальное не поможет.

person dlb8685    schedule 25.11.2014
comment
Для будущих читателей: я только что проверил этот пример, и история заполнена правильно: requests.get('http://en.wikipedia.org/wiki/Google_Inc_Class_A', allow_redirects=True). Я не знаю, связано ли это с параметрами allow_redirects или с новой версией пакета запросов. - person boh717; 20.07.2016

Это зависит от того, как они выполняют перенаправление. «Правильный» способ - вернуть код статуса перенаправленного HTTP (301/302/303). «Неправильный» способ - разместить метатег обновления в HTML.

Если они сделают первое, requests обработает это прозрачно. Обратите внимание, что любое разумное перенаправление страницы с ошибкой по-прежнему будет иметь код состояния ошибки (например, 404), который вы можете проверить как response.status_code.

person Katriel    schedule 20.11.2012