Как Python "запросы" предоставляет данные истории URL?
В 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 перенаправления? Может быть, какой-нибудь эксперт по питону может помочь?
HTTP-перенаправления обычно принимают форму кода ответа 3xx плюс заголовок "Location:", который указывает, куда перенаправить. Это кодифицировано в протоколе HTTP, и поэтому любая совместимая клиентская реализация будет просто делать то, что говорит эта спецификация.
Иными словами, если вы вызываете requests
на посещение URL-адреса (с разрешенным перенаправлением - его можно отключить с помощью параметра в requests
), а сервер говорит "иди сюда вместо", requests
будут внутренне вызывать себя для нового URL-адреса, и добавьте предыдущую в историю столько раз, сколько потребуется, чтобы добраться до страницы, которая не перенаправляет, или вы достигнете предела (обычно устанавливается около 30, чтобы предотвратить махинации, такие как перенаправление страницы на себя в бесконечном цикле),
Многие веб-серверы, такие как CMS, полагаются на конфигурации перезаписи URL-адресов на стороне сервера, которые позволяют программисту генерировать (структурно) простой URL-адрес, который сервер затем разрешает и перенаправляет в другое местоположение, которое может быть более удобным для человеческого глаза или соответствовать единое соглашение, определенное администратором этого сервера, и некоторые сети доставки контента используют перенаправление для отправки каждого посетителя на сервер, который близок к ним географически или с точки зрения топологии сети. Отслеживание кликов также часто заставляет ваш браузер переходить по уникальному URL-адресу перед его отправкой, чтобы фактически извлечь контент, который он пытается отобразить. Из-за этих методов, нередко видеть несколько перенаправлений при попытке получить что-то.
Кроме того, но на самом деле за пределами того, что поддерживают requests
или аналогичные библиотеки, интерактивные браузеры также обычно поддерживают JavaScript, что позволяет веб-странице запускать код в браузере, что может привести к ее посещению новой страницы под программным управлением (то есть, возможно, в сложных условиях). что может даже не быть полностью детерминированным). Если вам нужно это поддержать, популярное в настоящее время решение состоит в том, чтобы запустить настоящий интерактивный браузер (возможно, "безголовый", то есть без видимого пользовательского интерфейса) и заставить его каким-либо образом сообщать свое состояние Python.
Я думаю, вы неправильно понимаете, как работает перенаправление.
Перенаправление - это действие на стороне клиента, которое означает, что если вы не выполните перенаправление, вы не будете перенаправлены. Так что на самом деле requests
делает это перенаправление для вас. Не удивительно, что он может проследить историю.
Допустим, если вы отправляете запрос на a.com
а ответ перенаправляется на b.com
, то requests
сделают еще один запрос на b.com
и добавят этот a.com
в историю.
Если ответ b.com
также перенаправляет, скажем, на c.com
, то requests
будут делать то же самое: сделать еще один запрос на c.com
и добавить этот b.com
в историю.
Вот связанный метод resolve_redirects
, это генератор, и я считаю, что его нетрудно понять.
Может быть, это поможет вам: http://docs.python-requests.org/en/latest/user/quickstart/#redirection-and-history и это: библиотека запросов Python перенаправляет новый URL
- Вопросы
- Http-redirect
- Как Python "запросы" предоставляет данные истории URL?