|
| 1 | +# coding=utf-8 |
| 2 | +import os |
| 3 | +from urllib import request |
| 4 | + |
| 5 | +import requests |
| 6 | +import urllib3 |
| 7 | + |
| 8 | +import wget |
| 9 | +from tqdm import tqdm |
| 10 | + |
| 11 | +url = 'https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg' |
| 12 | + |
| 13 | +def requests_download(): |
| 14 | + |
| 15 | + content = requests.get(url).content |
| 16 | + |
| 17 | + with open('pic_requests.jpg', 'wb') as file: |
| 18 | + file.write(content) |
| 19 | + |
| 20 | +def urllib_download(): |
| 21 | + request.urlretrieve(url, 'pic_urllib.jpg') |
| 22 | + |
| 23 | + |
| 24 | +def urllib3_download(): |
| 25 | + # 创建一个连接池 |
| 26 | + poolManager = urllib3.PoolManager() |
| 27 | + |
| 28 | + resp = poolManager.request('GET', url) |
| 29 | + with open("pic_urllib3.jpg", "wb") as file: |
| 30 | + file.write(resp.data) |
| 31 | + |
| 32 | + resp.release_conn() |
| 33 | + |
| 34 | + |
| 35 | +def wget_download(): |
| 36 | + wget.download(url, out='pic_wget.jpg') |
| 37 | + |
| 38 | +def steam_download(): |
| 39 | + url = 'https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe' |
| 40 | + |
| 41 | + with requests.get(url, stream=True) as r: |
| 42 | + with open('vscode.exe', 'wb') as flie: |
| 43 | + # chunk_size 指定写入大小每次写入 1024 * 1024 bytes |
| 44 | + for chunk in r.iter_content(chunk_size=1024*1024): |
| 45 | + if chunk: |
| 46 | + flie.write(chunk) |
| 47 | + |
| 48 | +def tqdm_download(): |
| 49 | + url = 'https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe' |
| 50 | + |
| 51 | + resp = requests.get(url, stream=True) |
| 52 | + |
| 53 | + # 获取文件大小 |
| 54 | + file_size = int(resp.headers['content-length']) |
| 55 | + |
| 56 | + with tqdm(total=file_size, unit='B', unit_scale=True, unit_divisor=1024, ascii=True, desc='vscode.exe') as bar: |
| 57 | + with requests.get(url, stream=True) as r: |
| 58 | + with open('vscode.exe', 'wb') as fp: |
| 59 | + for chunk in r.iter_content(chunk_size=512): |
| 60 | + if chunk: |
| 61 | + fp.write(chunk) |
| 62 | + bar.update(len(chunk)) |
| 63 | + |
| 64 | +def duan_download(): |
| 65 | + url = 'https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe' |
| 66 | + |
| 67 | + r = requests.get(url, stream=True) |
| 68 | + |
| 69 | + # 获取文件大小 |
| 70 | + file_size = int(r.headers['content-length']) |
| 71 | + |
| 72 | + file_name = 'vscode.exe' |
| 73 | + # 如果文件存在获取文件大小,否在从 0 开始下载, |
| 74 | + first_byte = 0 |
| 75 | + if os.path.exists(file_name): |
| 76 | + first_byte = os.path.getsize(file_name) |
| 77 | + |
| 78 | + # 判断是否已经下载完成 |
| 79 | + if first_byte >= file_size: |
| 80 | + return |
| 81 | + |
| 82 | + # Range 加入请求头 |
| 83 | + header = {"Range": f"bytes={first_byte}-{file_size}"} |
| 84 | + |
| 85 | + # 加了一个 initial 参数 |
| 86 | + with tqdm(total=file_size, unit='B', initial=first_byte, unit_scale=True, unit_divisor=1024, ascii=True, desc=file_name) as bar: |
| 87 | + # 加 headers 参数 |
| 88 | + with requests.get(url, headers = header, stream=True) as r: |
| 89 | + with open(file_name, 'ab') as fp: |
| 90 | + for chunk in r.iter_content(chunk_size=512): |
| 91 | + if chunk: |
| 92 | + fp.write(chunk) |
| 93 | + bar.update(len(chunk)) |
| 94 | + |
| 95 | + |
| 96 | +if __name__ == '__main__': |
| 97 | + duan_download() |
0 commit comments