如何在web上获取文件的真实URL。(Python)

如何在web上获取文件的真实URL。(Python),python,linux,http,unix,http-headers,Python,Linux,Http,Unix,Http Headers,我注意到,有时互联网上的音频文件有一个“假”URL 这将302连接到实际URL: http://garageband.com/michael_jackson4.mp3 我的问题是…当提供了假URL时,如何从标题中获取真实的URL 目前,这是我用来读取文件头的代码。我不知道这段代码是否能满足我的需求。如何从响应头解析出“真实”URL import httplib conn = httplib.HTTPConnection(head) conn.request("HEAD",tail) res =

我注意到,有时互联网上的音频文件有一个“假”URL

这将302连接到实际URL:

http://garageband.com/michael_jackson4.mp3
我的问题是…当提供了假URL时,如何从标题中获取真实的URL

目前,这是我用来读取文件头的代码。我不知道这段代码是否能满足我的需求。如何从响应头解析出“真实”URL

import httplib
conn = httplib.HTTPConnection(head)
conn.request("HEAD",tail)
res = conn.getresponse()
这有一个302重定向:

您必须阅读响应,意识到您得到了一个302(找到),并从响应头解析出真实的URL,然后使用新的URI获取资源。

使用urllib.getUrl()

编辑: 对不起,我已经有一段时间没有这样做了:

import urllib
urllib.urlopen(url).geturl()
例如:

>>> f = urllib2.urlopen("http://tinyurl.com/oex2e")
>>> f.geturl()
'http://www.amazon.com/All-Creatures-Great-Small-Collection/dp/B00006G8FI'
>>> 

MarkPilgrim建议在“”中使用,因为它以更智能的方式处理许多事情(包括重定向)

>>> import httplib2
>>> h = httplib2.Http()
>>> response, content = h.request("http://garagaeband.com/3252243")
>>> response["content-location"]
    "http://garageband.com/michael_jackson4.mp3"
我解出了答案

 import urllib2
    req = urllib2.Request('http://' + theurl)
    opener = urllib2.build_opener()
    f = opener.open(req)
    print 'the real url is......' + f .url

我如何解析出真正的URL表单响应头?Python的urllib和urllib2为您跟踪重定向,并跟踪新的URL,正如Chris Lacasse在其解决方案中所暗示的那样。然而,我似乎无法测试它,因为我对要测试的服务器了如指掌,而且不想自己设置一个服务器尝尝罐头。我相信这与tinyurl.com的案例很相似,因为它是一个可以测试的东西。虽然看起来你是以交互方式做的,但实际上你只是写出了预期的结果。否则,您不会在请求URL中列出两次“http”,您会看到“garageband.com”(在OP的描述中)实际上不存在,并引发“没有与nodename关联的地址”错误。我使用了一个交互式会话,并用海报的示例url替换url:)谢谢你的指针。我将更正“http://”repeation^ u^“curl”-“curl:(6)无法解析主机‘garageband.com’”。当您请求中的域名不存在时,交互式会话如何工作?如上所述,我确实使用了一个交互式会话,但使用了“重定向到”,然后用海报的示例URL替换它,因为我认为它更具说明性。不知怎的,评论系统吃掉了我的“www”在第二个deck.cc url=)中,不需要所有这些步骤。最简单的方法是执行“urllib2.urlopen('http…').geturl()。如果您想要一个请求对象,那么“urllib2.urlopen(req)”也可以使用。
 import urllib2
    req = urllib2.Request('http://' + theurl)
    opener = urllib2.build_opener()
    f = opener.open(req)
    print 'the real url is......' + f .url