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