如何在不下载Python的情况下检查重定向的网页地址
对于给定的url,如何在HTTP重定向后检测最终的internet位置,而不使用python下载最终页面(例如HEAD请求)。我正在尝试编写一个大规模下载程序,我的下载机制需要在下载之前知道页面的互联网位置 编辑 最后我做了这件事,我希望这能帮助其他人。我仍然对其他方法持开放态度如何在不下载Python的情况下检查重定向的网页地址,python,http,http-headers,urllib2,httplib,Python,Http,Http Headers,Urllib2,Httplib,对于给定的url,如何在HTTP重定向后检测最终的internet位置,而不使用python下载最终页面(例如HEAD请求)。我正在尝试编写一个大规模下载程序,我的下载机制需要在下载之前知道页面的互联网位置 编辑 最后我做了这件事,我希望这能帮助其他人。我仍然对其他方法持开放态度 import urlparse import httplib def getFinalUrl(url): "Navigates Through redirections to get final url."
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
您可以使用发送HEAD请求。您还可以查看一下,它似乎是HTTP请求的新流行API,取代了可能笨拙的
httplib2
。(见附件)
它还有一个
head()
方法用于此操作。我强烈建议您使用请求库。它编码良好,并得到积极维护。请求可以生成您需要的任何内容,如预回迁/
从请求文件中:
默认情况下,当您发出请求时,会立即下载响应主体。您可以覆盖此行为并推迟下载响应正文,直到使用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
...
如果int(r.headers['content-length'])<太长:
content=r.content
...
您可以使用
Response.iter\u content
和Response.iter\u line方法,或者从底层urllib3urllib3.HTTPResponse
atResponse.raw
读取详细的重定向,进一步控制工作流。我需要手动完成吗?现在是r=requests.get(tarball\u url,stream=True)