【问题标题】:How to follow page redirects using requests [duplicate]如何使用请求跟踪页面重定向[重复]
【发布时间】:2019-07-22 02:21:29
【问题描述】:

我有这个简单的代码:

import requests
r = requests.get('https://yahoo.com')
print(r.url)

执行后,打印:

https://uk.yahoo.com/?p=us

我想看看:

  1. 在到达https://uk.yahoo.com/?p=us 之前发生了多少重定向(显然,我最初输入https://yahoo.com 时有重定向)?

  2. 我还想保存每一页的内容,而不仅仅是最后一页。如何做到这一点?

【问题讨论】:

  • 您希望requests自动跟随重定向,这样您就可以看到链中的每个页面。然后您可以继续手动跟踪它们,直到获得最终结果。

标签: python python-3.x web-scraping python-requests python-requests-html


【解决方案1】:

使用response.history。来自documentation...

Response.history 列表包含之前的 Response 对象 创建以完成请求。该列表从 从最旧到最近的响应。

因此,要获取中间 URL 的数量,您可以执行以下操作:

response = requests.get(url)
print(len(response.history))

要了解这些 URL 的实际含义以及它们的响应包含的内容,您可以这样做:

for resp in response.history:
    print(resp.url, resp.text)

如果需要,您还可以通过将可选参数allow_redirects 设置为False 来向中间URL 提交新请求:

r = requests.get(resp.url, allow_redirects=False)

【讨论】:

  • 请注意,在发出中间 URL 请求时,您不必遵循重定向。
  • @AndroidNoobie 为什么一定要用urlib?有没有办法使用请求获取内容(我的意思是页面内容)?
  • 是的,r = requests.get(url, allow_redirects=False)。我会更新我的答案,即使这被标记为重复。
  • 要获取中间页面内容,而不是每个历史项目respr = requests.get(resp.url, allow_redirects=False),我不能使用resp.text,因为每个历史项目已经是一个响应对象吗?
  • 我认为不需要为每个历史项目提交新的请求。它们已经是响应对象。只需从中提取数据。所以你的答案应该是 for resp in response.history 你 d=just do print(resp.text)。无需为每个 url 做新的 get.request。请更新答案或纠正我。
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 2012-09-16
  • 2013-04-15
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
相关资源
最近更新 更多