Как Python "запросы" предоставляет данные истории URL? - PullRequest
0 голосов
/ 03 апреля 2019

В Python requests, если я следую за history url ответа, он предоставляет мне 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 перенаправления?Может быть, какой-нибудь эксперт по питону может помочь?

Ответы [ 3 ]

0 голосов
/ 13 апреля 2019

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

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

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

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

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

0 голосов
/ 13 апреля 2019

Полагаю, вы неправильно понимаете, как работает перенаправление.

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

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

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

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

0 голосов
/ 03 апреля 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...