5

我正在寻找从 http url 下载文件到本地文件。该文件足够大,我想下载它并将其保存为块,而不是read()write()整个文件保存为一个巨大的字符串。

的界面urllib.urlretrieve本质上就是我想要的。但是,我看不到通过 下载时设置请求标头的方法 urllib.urlretrieve,这是我需要做的事情。

如果我使用,我可以通过它的对象urllib2设置请求头。Request但是,我没有看到将urllib2文件直接下载到磁盘上的路径(如urlretrieve. 相反,我似乎将不得不使用循环来迭代返回的数据块,自己将它们写入文件并检查我们何时完成。

urllib.urlretrieve构建一个可以工作但允许传入请求标头的函数的最佳方法是什么?

4

2 回答 2

3

使用 urllib2 编写自己的函数有什么危害?

import os
import sys
import urllib2

def urlretrieve(urlfile, fpath):
    chunk = 4096
    f = open(fpath, "w")
    while 1:
        data = urlfile.read(chunk)
        if not data:
            print "done."
            break
        f.write(data)
        print "Read %s bytes"%len(data)

并使用请求对象设置标头

request = urllib2.Request("http://www.google.com")
request.add_header('User-agent', 'Chrome XXX')
urlretrieve(urllib2.urlopen(request), "/tmp/del.html")
于 2010-01-08T15:53:49.750 回答
2

如果你想使用 urllib 和 urlretrieve,子类化urllib.URLopener并使用它的addheader()方法来调整标题(即:addheader('Accept', 'sound/basic'),我从 urllib.addheader 的文档字符串中提取)。

要安装供 urllib 使用的 URLopener,请参阅文档的urllib._urlopener部分中的示例(注意下划线):

import urllib

class MyURLopener(urllib.URLopener):
    pass # your override here, perhaps to __init__

urllib._urlopener = MyURLopener

但是,您会很高兴听到您对问题评论的评论,读取一个空字符串read()确实是停止的信号。例如,这就是 urlretrieve 处理何时停止的方式。TCP/IP 和套接字将读取过程抽象化,阻止等待附加数据,除非另一端的连接是 EOF 并关闭,在这种情况下,从连接中读取()会返回一个空字符串。一个空字符串意味着没有数据流入......您不必担心有序的数据包重新组装,因为这一切都已为您处理。如果这是您对 urllib2 的关注,我认为您可以安全地使用它。

于 2009-04-08T01:46:37.797 回答