2013-04-11 163 views
3

我想用python下载一个zip文件。如何使用python下载推送到浏览器的文件?

使用这种类型的URL, http://server.com/file.zip 这很简单,通过使用urllib2.urlopen并将其写入本地文件中。

但在我的情况下,我有这种类型的网址: http://server.com/customer/somedata/download?id=121&m=zip, 表单验证后启动下载。

在我的情况下,我想将它部署在heroku上,这样做可能很有用,所以我不能使用用C++构建的spynner。此下载是在使用scrapy进行刮取后启动的。

从浏览器下载效果很好,我用它的名字得到了一个好的zip文件。使用Python我只是得到HTML和标题数据...

有没有什么办法从这种类型的URL在python中获取文件?

+0

可能重复的[Scrapy,定义一个pipleine来保存文件?](http://stackoverflow.com/questions/7123387/scrapy-define-a-pipleine-to-save-files) – Blender 2013-04-11 17:19:00

+0

什么是响应喜欢?它是一个HTML页面吗?或者它是您正在使用的实际文件,就像Scrapy'Response'对象一样? – Blender 2013-04-11 17:27:39

+0

这不是重复的,在这里我不能得到.body就像在pdf文件中。 – 2013-04-11 17:40:05

回答

1

本网站正在提供JavaScript,然后调用下载。 您别无选择,只能:a)在模拟浏览器环境中评估JavaScript或b)手动解析JS所做的事情,并在python中重新实现它。例如字符串提取URL和下载密钥,可能调用AJAX请求,最后下载文件

我一般推荐Mechanize用于网页相关的自动化,但它也无法处理JavaScript,所以我想你可以坚持使用Scrapy if你想去计划b)。

+0

Mechanize不支持JavaScript。 – Blender 2013-04-11 17:24:25

+0

我知道,但也许需要cookie – ch3ka 2013-04-11 17:24:53

+0

Scrapy负责cookies,会话,重定向等,所以我不认为机械化会增加任何额外的功能。 – Blender 2013-04-11 17:26:04

0

当您在浏览器中进行下载时,打开开发人员控制台的网络选项卡,并记录HTTP方法(可能是POST),POST参数,Cookie以及验证组成部分的其他内容;然后使用库来复制它。

相关问题