Как Python "запросы" предоставляет данные истории URL?

97
12

В requests python, если я следую за url history ответов, он предоставляет мне URL перенаправления следующим образом:

import requests
response = requests.get('https://yahoo.com')
for resp in response.history:
print(resp.url, resp.text)

Q: Кто-нибудь знает, откуда взяты urls перенаправления? заголовки? Если заголовок не содержит элемент location но выполняет перенаправление, как он будет определять URL-адрес перенаправления? Можете ли вы предоставить ссылки, пожалуйста?

РЕДАКТИРОВАТЬ:

Я посмотрел на документацию. Здесь не сказано "как". Некоторые ответы показывают, что это headers['Location']. Я не уверен. Являются ли URL перенаправления, которые я извлекаю из ответа истории (элемент за элементом), просто заголовком "Расположение" в каждом ответе? или есть что-то еще, что библиотека использует для определения URL перенаправления? Может быть, какой-нибудь эксперт по питону может помочь?

спросил(а) 2019-04-03T21:47:00+03:00 1 год, 4 месяца назад
1
Решение
116

HTTP-перенаправления обычно принимают форму кода ответа 3xx плюс заголовок "Location:", который указывает, куда перенаправить. Это кодифицировано в протоколе HTTP, и поэтому любая совместимая клиентская реализация будет просто делать то, что говорит эта спецификация.

См. RFC 7231, раздел 6.4.

Иными словами, если вы вызываете requests на посещение URL-адреса (с разрешенным перенаправлением - его можно отключить с помощью параметра в requests), а сервер говорит "иди сюда вместо", requests будут внутренне вызывать себя для нового URL-адреса, и добавьте предыдущую в историю столько раз, сколько потребуется, чтобы добраться до страницы, которая не перенаправляет, или вы достигнете предела (обычно устанавливается около 30, чтобы предотвратить махинации, такие как перенаправление страницы на себя в бесконечном цикле),

Многие веб-серверы, такие как CMS, полагаются на конфигурации перезаписи URL-адресов на стороне сервера, которые позволяют программисту генерировать (структурно) простой URL-адрес, который сервер затем разрешает и перенаправляет в другое местоположение, которое может быть более удобным для человеческого глаза или соответствовать единое соглашение, определенное администратором этого сервера, и некоторые сети доставки контента используют перенаправление для отправки каждого посетителя на сервер, который близок к ним географически или с точки зрения топологии сети. Отслеживание кликов также часто заставляет ваш браузер переходить по уникальному URL-адресу перед его отправкой, чтобы фактически извлечь контент, который он пытается отобразить. Из-за этих методов, нередко видеть несколько перенаправлений при попытке получить что-то.

Кроме того, но на самом деле за пределами того, что поддерживают requests или аналогичные библиотеки, интерактивные браузеры также обычно поддерживают JavaScript, что позволяет веб-странице запускать код в браузере, что может привести к ее посещению новой страницы под программным управлением (то есть, возможно, в сложных условиях). что может даже не быть полностью детерминированным). Если вам нужно это поддержать, популярное в настоящее время решение состоит в том, чтобы запустить настоящий интерактивный браузер (возможно, "безголовый", то есть без видимого пользовательского интерфейса) и заставить его каким-либо образом сообщать свое состояние Python.

ответил(а) 2019-04-13T08:44:00+03:00 1 год, 3 месяца назад
39

Я думаю, вы неправильно понимаете, как работает перенаправление.

Перенаправление - это действие на стороне клиента, которое означает, что если вы не выполните перенаправление, вы не будете перенаправлены. Так что на самом деле requests делает это перенаправление для вас. Не удивительно, что он может проследить историю.

Допустим, если вы отправляете запрос на a.com а ответ перенаправляется на b.com, то requests сделают еще один запрос на b.com и добавят этот a.com в историю.

Если ответ b.com также перенаправляет, скажем, на c.com, то requests будут делать то же самое: сделать еще один запрос на c.com и добавить этот b.com в историю.

Вот связанный метод resolve_redirects, это генератор, и я считаю, что его нетрудно понять.

ответил(а) 2019-04-13T09:11:00+03:00 1 год, 3 месяца назад
39
ответил(а) 2019-04-03T22:03:00+03:00 1 год, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема