2

对于给定的 url,如何在 HTTP 重定向后检测最终的 Internet 位置,而不使用 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
4

3 回答 3

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 方法进一步控制工作流,或者从底层 urllib3urllib3.HTTPResponse中读取Response.raw

于 2012-09-19T10:04:34.090 回答
0

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

于 2011-09-20T11:42:03.587 回答
0

您还可以查看python-requests,它似乎是用于 HTTP 请求的新流行 API,取代了可能笨拙的httplib2. (请参阅为什么不 httplib2

它也有一个head()方法。

于 2011-09-20T12:08:40.607 回答