快速浏览一下 Firefox 页面上的 javascript 会发现:
// 2. Build download.mozilla.org URL out of those vars.
download_url = "http://download.mozilla.org/?product=";
download_url += product + '&os=' + os + '&lang=' + lang;
因此,只需将您的网址更改为:
http://www.mozilla.com/products/download.html?product=firefox-3.6.3&os=win&lang=en-US
至
http://download.mozilla.org/?product=firefox-3.6.3&os=win&lang=en-US
所以现在我将检查标题,看看我们真正得到了什么......
$ curl -I "http://download.mozilla.org/?product=firefox-3.6.3&os=win&lang=en-US"
HTTP/1.1 302 Found
Server: Apache
X-Backend-Server: pp-app-dist09
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0, private
Content-Type: text/html; charset=UTF-8
Date: Sat, 08 May 2010 21:02:50 GMT
Location: http://mozilla.mirror.ac.za/firefox/releases/3.6.3/win32/en-US/Firefox Setup 3.6.3.exe
Pragma: no-cache
Transfer-Encoding: chunked
Connection: Keep-Alive
Set-Cookie: dmo=10.8.84.200.1273352570769772; path=/; expires=Sun, 08-May-11 21:02:50 GMT
X-Powered-By: PHP/5.1.6
所以这实际上是一个 302 重定向,所以现在使用 Location 标头中的内容作为您的新 url 来获取实际文件。您需要弄清楚如何发出请求并自行阅读标题(抱歉,我没有太多时间)。解析位置标头后,您可以使用正则表达式删除位置的其余部分以获取文件名以将文件保存到:
>>> location = 'http://mozilla.mirror.ac.za/firefox/releases/3.6.3/win32/en-US/Firefox Setup 3.6.3.exe'
>>> re.match('^.*/(.*?)$', location).groups()[0]
'Firefox Setup 3.6.3.exe'
因此,要获得实际的文件名,您需要自己遵循 302。我将留给您所需的代码,但希望这将为您指明正确的方向。