您的位置:首页 > 编程语言 > Python开发

Python 多线程下载脚本

2016-07-25 12:13 459 查看
#!/usr/bin/env python
# coding:utf8
import requests
import threading
import sys

class downloader:
def __init__(self):         ## 判断是否有位置参数或位置参数过多
if len(sys.argv) == 2:  ## 第一参数为脚本
self.url = sys.argv[1]
else:
print 'Input error options...'
sys.exit(1)         ## 位置参数错误,输出并退出
self.num = 8            ## 如果需要自己手动输入线程数,可使用raw_input
self.name = self.url.split('/')[-1]  ##获取要下载的文件名
res = requests.head(self.url)
self.total = int(res.headers['Content-Length']) ## 获取文件总长字节
## 如果total为0,表示文件不存在,或路径错误,并退出
if self.total == 0:
print "The error path..."
sys.exit(2)
print 'total is %s ' % (self.total)
def get_range(self):
list = []
offset = int(self.total/self.num)
for i in range(self.num):
if i == self.num-1:
list.append((i*offset,''))
else:
list.append((i*offset,(i+1)*offset))
return list
def download(self,start,end):
headers = {'Range':'Bytes=%s-%s' % (start,end),'Accept-Encoding':'*'}
res = requests.get(self.url,headers=headers)
print '%s:%s download success' % (start,end)
self.fd.seek(start)    ## 指针位置
self.fd.write(res.content)
def rget(self):
self.fd = open(self.name,'w')
thread_lit = []
n = 0
for ran in self.get_range():
start,end = ran
print 'thread %d start:%s,end:%s' % (n,start,end)
n+=1
thread = threading.Thread(target=self.download,args=(start,end))
thread.start()
thread_lit.append(thread)
for j in thread_lit:
j.join()
print 'download %s load success' %(self.name)
self.fd.close()

if __name__ == '__main__':
down =downloader()
down.rget()
自己改版,可能有所不足,其源脚本位置:https://github.com/shengxinjing/my_blog/blob/master/downloader/downloader.py
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多线程 python