0

我正在使用 python 中的 mechanize 库来下载大文件。我正在使用 mechanize 检索表单中的数据。

使用 python 同时下载太多文件的问题是我的系统内存 (RAM) 很快就会用完。

我能想到的一种减少内存使用的方法是下载文件的部分内容并继续将它们保存到硬盘上。但是我从中下载文件的互联网服务器使用 HTTP/1.0。因此,当我在下载请求中添加 Range 标头时, Range: bytes=0-8192 ,服务器从第 8192 个字节开始返回文件。

我添加的标头是否有问题,或者 HTTP/1.0 无法下载部分内容?

有没有其他方法可以减少下载脚本的内存使用?

这是下载文件的python代码:

br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)

webpage = <url>
br.addheaders = [("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:16.0) Gecko/20100101 Firefox/16.0"), ("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),("Accept-Language","en-US,en;q=0.5"),("Accept-Encoding","gzip, deflate"),("DNT","1")]
br.open(webpage)

br.select_form(name='receive')

fl_nm = "test.pdf"

br.addheaders = [("Range", "bytes=0-8192")]
response = br.submit() # submits the form, just like if you clicked the submit button
fileObj = open(direc+'/'+fl_nm,"w") # open for write
fileObj.write(response.read())
fileObj.close()
4

2 回答 2

0

尝试类似:

def output_page(file_name, url, chunk=1024):
    f = open(file_name,'wb') # open file
    page = urllib.urlopen(url) # open webpage
    s = page.read(chunk) # read the first chunk
    while s: # once the page is read, s == ''
        f.write(s) # write data
        s = page.read(chunk) # and read the next chunk
于 2013-04-27T11:22:53.090 回答
0

响应就像一个文件句柄,因此您可以逐块读取它:

response = br.open('...')

with open('output.ext', 'wb') as handle:
    for chunk in iter((lambda: response.read(4096)), ''):
        handle.write(chunk)

因此,不是将整个文件读入内存然后将其写回,而是一次读取 4096 个字节。

于 2013-04-27T11:12:48.200 回答