如何在Python中检查重定向的网页地址,而不下载它
对于一个给定的网址,我该如何在经过HTTP重定向后,检测到最终的互联网位置,而不下载最终的页面(比如使用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
你可以看看 python-requests,这个库现在很流行,用来发送HTTP请求,替代了可能有点麻烦的 httplib2
。想了解为什么不使用httplib2,可以查看 为什么不使用httplib2。
它还有一个 head()
方法可以用来处理相关的请求。
0
你可以使用 httplib
来发送HEAD请求。
1
我强烈建议你使用requests库。这个库写得很好,而且一直在维护。使用requests可以满足你需要的各种功能,比如预取数据。
根据requests的文档 http://docs.python-requests.org/en/latest/user/advanced/ :
默认情况下,当你发起请求时,响应的内容会立即下载。你可以改变这个默认行为,等到你访问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
来进一步控制工作流程。