使用具有服务器限制的python流下载文件

使用具有服务器限制的python流下载文件,python,web-crawler,python-requests,Python,Web Crawler,Python Requests,我尝试使用python从服务器下载文件,有时文件非常大,我希望有一些进度条,我可以想出的一种方法是在流中下载,以便打印进度。目前,我已经尝试了标准的urlopen、urlretrieve和requests模块(打开了stream) 显然,urlopen无法在流中下载文件,请求模块支持这一点,但是,服务器对我一次可以下载的文件有限制(限制为1)。所以每次,我尝试使用请求,它只得到网页告诉我等待,有没有其他方法可以做到这一点 我最近下载了许多具有此功能的媒体: import sys import r

我尝试使用python从服务器下载文件,有时文件非常大,我希望有一些进度条,我可以想出的一种方法是在流中下载,以便打印进度。目前,我已经尝试了标准的urlopen、urlretrieve和requests模块(打开了stream)


显然,urlopen无法在流中下载文件,请求模块支持这一点,但是,服务器对我一次可以下载的文件有限制(限制为1)。所以每次,我尝试使用请求,它只得到网页告诉我等待,有没有其他方法可以做到这一点

我最近下载了许多具有此功能的媒体:

import sys
import requests
import time
def download_resource(domain, url, file_name = None, download = True):
    cookies = {}
    s = requests.Session()

    s.config['keep_alive'] = True
    #add your own cookies here, I have a specific function I call
    #for my application but yours is different
    r = s.get(url, cookies = cookies, stream = True)

    if not r.ok:
        print "error in downloading"
        return -1

    file_size = int(r.headers['content-length']) 

    if not file_name:
        try:
            temp = r.headers['content-disposition']
        except Exception as e:
            pass
            #failing download
            return -1
        else:
            if not temp:
                return -1
            else:
                file_name = temp.split("filename=")[-1]
                return_obj["filename"] = file_name
    #print "File size:", file_size
    #print "\n", str(self.entire_size / float(1024*1024*1024)), "\n"
    print "Downloading:", file_name
    if download:
        with open(file_name, "wb") as fh:
            count = 1
            chunk_size = 1048576
            start_time = time.time()
            try:
                for block in r.iter_content(chunk_size):
                    total_time = time.time() - start_time
                    percent = count*chunk_size/float(file_size) * 100.0
                    fraction = int(percent/5)

                    download_speed = 1.0 / total_time

                    sys.stdout.write('\r')
                    sys.stdout.write("[%-20s] %d%%  %3.2f MB/s       " % ('='* fraction , percent, download_speed))
                    sys.stdout.flush()
                    if not block:
                        break
                    fh.write(block)
                    count += 1
                    start_time = time.time()
            except Exception as e:
                print e
            finally:    
                #close up the stream
                r.close()

我做了类似的事情,但只收到一个网页,上面说我需要等待几秒钟才能下载下一个文件,几秒钟后,它又说了同样的话。我猜这是因为服务器同时限制了一个连接。如果我使stream=False,则不会发生这种情况。你知道吗?你在请求中使用会话对象吗?据我所知,您所说的是,Web服务器将单个客户端的并发连接数限制为一个。如果您没有使用会话对象,我会尝试这样做,并设置keep alive。我确实使用了会话,但我关闭了keep alive并忘记打开它。我要再试一次。谢谢现在可以正常工作,但仍有问题,请参阅[链接]()