【问题标题】:How to check redirected web page address, without downloading it in Python如何检查重定向的网页地址,而不用 Python 下载
【发布时间】:2011-11-21 00:27:00
【问题描述】:

对于给定的 url,如何在 HTTP 重定向后检测最终的互联网位置,而不使用 python 下载最终页面(例如 HEAD 请求。)。我正在尝试编写一个海量下载器,我的下载机制需要在下载之前知道页面的互联网位置。

编辑

我最终这样做了,我希望这对其他人有所帮助。我仍然对其他方法持开放态度。

import urlparse
import httplib

def getFinalUrl(url):
    "Navigates Through redirections to get final url."
    parsed = urlparse.urlparse(url)
    conn = httplib.HTTPConnection(parsed.netloc)
    conn.request("HEAD",parsed.path)
    response = conn.getresponse()
    if str(response.status).startswith("3"):
        new_location = [v for k,v in response.getheaders() if k == "location"][0]
        return getFinalUrl(new_location)
    return url

【问题讨论】:

    标签: python http http-headers urllib2 httplib


    【解决方案1】:

    我强烈建议您使用 requests 库。它编码良好并积极维护。请求可以做任何你需要的事情,比如预取/

    来自请求的文档http://docs.python-requests.org/en/latest/user/advanced/

    默认情况下,当您发出请求时,会立即下载响应的正文。您可以覆盖此行为并延迟下载响应正文,直到您使用 prefetch 参数访问 Response.content 属性:

    tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
    r = requests.get(tarball_url, prefetch=False)
    

    此时只下载了响应头并且连接保持打开状态,因此我们可以使内容检索有条件:

    if int(r.headers['content-length']) < TOO_LONG:
      content = r.content
      ...
    

    您可以使用 Response.iter_content 和 Response.iter_lines 方法进一步控制工作流程,或者从底层 urllib3 urllib3.HTTPResponse Response.raw 读取

    【讨论】:

    • 现在是r = requests.get(tarball_url, stream=True)
    【解决方案2】:

    您可以使用httplib 发送 HEAD 请求。

    【讨论】:

    • 如何获得彻底的重定向。我需要手动执行吗?
    【解决方案3】:

    您还可以查看python-requests,它似乎是用于HTTP 请求的新流行API,取代了可能尴尬的httplib2。 (见Why Not httplib2

    它还有一个head() 方法。

    【讨论】:

      猜你喜欢
      • 2014-02-25
      • 2019-08-30
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 2016-01-18
      • 2012-11-03
      • 2016-04-01
      • 2011-11-06
      相关资源
      最近更新 更多