Dưới đây là một kịch bản Python rằng tiết kiệm url trao cho một tập tin và sử dụng nhiều chủ đề để tải về nó:
#!/usr/bin/env python
import sys
from functools import partial
from itertools import count, izip
from multiprocessing.dummy import Pool # use threads
from urllib2 import HTTPError, Request, urlopen
def download_chunk(url, byterange):
req = Request(url, headers=dict(Range='bytes=%d-%d' % byterange))
try:
return urlopen(req).read()
except HTTPError as e:
return b'' if e.code == 416 else None # treat range error as EOF
except EnvironmentError:
return None
def main():
url, filename = sys.argv[1:]
pool = Pool(4) # define number of concurrent connections
chunksize = 1 << 16
ranges = izip(count(0, chunksize), count(chunksize - 1, chunksize))
with open(filename, 'wb') as file:
for s in pool.imap(partial(download_part, url), ranges):
if not s:
break # error or EOF
file.write(s)
if len(s) != chunksize:
break # EOF (servers with no Range support end up here)
if __name__ == "__main__":
main()
Sự kết thúc của tập tin được phát hiện nếu một máy chủ trả về cơ thể trống rỗng, hoặc 416 mã HTTP, hoặc nếu kích thước phản hồi không chính xác là chunksize
.
Hỗ trợ máy chủ không hiểu tiêu đề Range
(mọi thứ được tải xuống trong một yêu cầu duy nhất trong trường hợp này; để hỗ trợ tệp lớn, thay đổi download_chunk()
để lưu vào tệp tạm thời và trả về tên tệp để đọc trong chuỗi chính thay vì chính nội dung tệp).
Nó cho phép thay đổi số lượng độc lập các kết nối đồng thời (kích thước nhóm) và số byte được yêu cầu trong một yêu cầu http duy nhất.
Để sử dụng nhiều quy trình thay vì chủ đề, thay đổi khẩu:
from multiprocessing.pool import Pool # use processes (other code unchanged)
Nếu bạn thực sự chỉ cần tải 1 tập tin, sau đó chỉ cần đi đến một thiết bị đầu cuối trên linux (nếu bạn đang sử dụng Linux) và chạy 'aria2c -x 16 -s 20 '. Tôi thích giải pháp của tôi bởi vì bất cứ khi nào tôi có nhiều tệp lớn (hoặc thậm chí chỉ 1 tệp lớn) mà tôi cần tải xuống, tôi chỉ cần đưa chúng vào thư mục 'MY_HTTP_LOC' và sau đó chạy tập lệnh của tôi. –
synaptik