python有什么处理大量文件下载的方法

angel725 发布于 2018/09/12 00:16
阅读 1K+
收藏 1

有几百个 文件。但都不大,最大的也就几兆

我用pycurl下载。

我把下载地址放到 列表 里了。

取出第一个下载,等下完了,在取第二个。

但问题是,几百个下载连接,pycurl怎么判断当前文件下载完了,然后开始下一个。

加载中
2
wei2011
wei2011

有requests这么好用的库,干嘛用pycurl。这种并发下载的,适合用多线程或协程,你不用判断它什么时候下载完,因为下载时它是阻塞了,只需要循环一个一个下就好了,给你写个gevent的版本(python3.6):

from gevent import monkey
from gevent.pool import Pool
monkey.patch_all()  # 打猴子补丁,所有io变非阻塞
import requests
from pathlib import Path

url_list = [  # 列表里是http://www.xxx.xxx/aa/bb/cc.zip这样的地址

]

def download(url):
    file_name = Path('D:\\') / url.split('/')[-1]  # 截取、拼接下载文件名
    if file_name.exists():  # 文件存在不在下载
        return

    print(f'下载:{url}')
    rsp = requests.get(url, stream=True)
    with open(file_name, 'wb') as f:
        for data in rsp.iter_content():
            f.write(data)

def run():
    pool = Pool(size=100)  # 协程池,并发大小100
    pool.map(download, url_list)


if __name__ == '__main__':
    run()
    print('ok')

 

wei2011
wei2011
回复 @Mr_Kong_ : 这里用到的Path是python3.4新引入的标准库pathlib 提供的,它重裁了操作符/,所以能这么写
Mr_Kong_
Mr_Kong_
file_name = Path('D:\\') / url.split('/')[-1] 你好,我想问下,拼接字符串不是 Path('D:\\', 'cc.zip')么,为什么可以写成Path('D:\\') / 'cc.zip'
0
careyjike
careyjike

把地址列表拆分为多个列表,使用多个线程下载。

判断下载完成可以判断返回的状态码,成功还是失败以及失败重试

返回顶部
顶部