python "requests" 如何提供历史 urls 数据?

How does python "requests" provides the history urls data?

在 python 的 requests 中,如果我遵循响应的 history url,它会为我提供重定向的 URL,如下所示:

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

问:有人知道重定向 urls 的来源吗? headers?如果header不包含location项但进行重定向,如何识别重定向URL?你能提供参考吗?

编辑:

我看了文档。它没有说 "how"。一些答案表明它是headers['Location']。我不知道。我从历史响应(逐项)中提取的重定向 URL 是否只是每个响应中的 'Location' header?还是图书馆使用其他任何东西来识别重定向 URLs?可能 python 专家可以提供帮助?

也许这会对您有所帮助:http://docs.python-requests.org/en/latest/user/quickstart/#redirection-and-history 还有这个:Python Requests library redirect new url

HTTP 重定向通常采用 3xx 响应代码加上“位置:”header 的形式,指示重定向到的位置。这是在 HTTP 协议中编纂的,因此任何符合规范的客户端实现都将简单地执行规范中的任何内容。

RFC 7231 Section 6.4.

换句话说,如果您调用 requests 访问 URL(允许重定向 - 它可以通过 requests 中的选项关闭)并且服务器说“改为转到此处”,requests 将在新的 URL 上内部调用自己,并将前一个添加到历史记录中,次数与到达未重定向的页面所需的次数一样多,或者您达到限制(通常设置为 30 之类的值,以防止恶作剧,例如页面在无限循环中重定向到自身)。

许多 Web 服务器(例如 CMS)依赖于 server-side URL 重写配置,允许程序员生成(结构上)简单的 URL,然后服务器解析并重定向到不同的位置可能对人眼更友好或符合该服务器管理员定义的统一约定,并且一些内容分发网络使用重定向将每个访问者发送到在地理上或在网络拓扑方面接近他们的服务器。 Clicktracking 还经常导致您的浏览器在发送它以实际获取它试图显示的内容之前通过唯一的 URL 跳转。由于这些技术,当您尝试获取某些内容时看到多个重定向并不少见。

此外,但实际上在 requests 或类似的库支持之外,交互式浏览器通常也支持 JavaScript,它允许网页在浏览器中 运行 编码可能会导致它在程序控制下访问新页面(即可能在甚至可能不是完全确定性的复杂条件下)。如果您需要支持这一点,目前流行的解决方案是 运行 一个真正的交互式浏览器(可能是“无头”,即没有可观察的用户界面)并让它以某种方式将其状态传达给 Python。

我猜你误解了重定向的工作原理。

重定向是客户端操作,这意味着如果您不进行重定向,就不会被重定向。所以实际上 requests 为你做了这个重定向。能追溯历史也就不足为奇了

假设您向 a.com 发送请求并且响应重定向到 b.com,那么 requests 将向 b.com 发送另一个请求并添加 a.com 进入历史。

如果 b.com 的响应也重定向到,比方说,c.com,那么 requests 将做同样的事情:对 c.com 做另一个请求并且将 b.com 添加到历史记录中。

Here是相关的方法resolve_redirects,它是一个生成器,相信不难理解。