如何检查重定向的网页地址,而无需在Python中下载

时间:2011-09-20 11:38:44

标签: python http http-headers urllib2 httplib

对于给定的网址,我如何在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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您还可以查看python-requests,它似乎是HTTP请求的新潮流API,取代了可能很笨拙的httplib2。 (见Why Not httplib2

它也有head()方法。

答案 2 :(得分:0)

我强烈建议您使用请求库。它编码良好,并得到积极维护。请求可以提供您需要的任何内容,例如prefetch /

来自“请求”文档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.HTTPResponse

上阅读基础urllib3 Response.raw