python download url 函数详解

函数代码如下:

import os, urllib,request, threading, posixpath, urllib.parse, atexit, random


pool_sema = threading.BoundedSemaphore(value=6)  #max number of download threads  #设置多线程的线程数

socket.setdefaulttimeout(5000)  #设置超时

in_progress = [] #定义一个空list供存储进行的download任务


def download(url):

pool_sema.acquire()  #开启线程池

path = urllib.parse.urlsplit(url).path  #解析url,去掉http://....(即第一个'/'前面的内容) 如http://www.baidu.com/tf/boys.jpg的结果为'/tf/boys.jpg'

filename = posixpath.basename(path) #取path字符串最后一个'/'后面的字符串作为名称 如'/tf/boys.jpg'的结果为'boys.jpg'

while os.path.exists(outputpath + '/' + filename):

filename = str(random.randint(0, 100)) + filename #如果检查到目标文件夹中已经有此下载内容,则对要下载的文件重命名,前面加上0-100间的随机数

in_progress.appen(filename) #将要下载的任务加入list

try:

urllib.request.urlretrieve(url, output_path + '/' + filename) #下载url对应的文件

in_progress.remove(filename) #下载成功从list中划掉此任务

  except:

print("----------------- Download failed: " + filename) #提示用户此文件下载失败

pool_sema.release() #释放线程池


def removeNotFinished():   #此函数用于程序关闭时的回调函数

for filename in in_progress:

try:

os.remove(output_path + '/' + filename)  #删除没有完成的任务

except FileNotFoundError:

pass



关于程序关闭时的回调函数:atexit.register(removeNotFinished)

定义了一个register函数用于注册程序退出时的回调函数,可以在这个回调函数中做一些资源清理的操作。如果程序是非正常的crash或者通过os._exit()退出,注册的回调函数将不会被调用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值