本文档介绍了Python下载文件的多种方法,从简单的小文件下载到断点续传下载大文件。Requests使用Requests模块的get方法从一个url下载文件,在python爬虫中常用于下载简单的网页内容导入请求#图片来自bing.comurl='https://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg'defrequests_download():content=requests.get(url).contentwithopen('pic_requests.jpg','wb')asfile:file.write(content)urllib使用python内置的urllib模块的urlretrieve方法直接将url请求保存为文件fromurllibimportrequest#图片来自bing.com:request.urlretrieve(url,'pic_urllib.jpg')urllib3urllib3是一个Python模块,用于Http客户端,使用连接池请求访问网络defurllib3_download():#创建连接池poolManager=urllib3.PoolManager()resp=poolManager.request('GET',url)withopen("pic_urllib3.jpg","wb")asfile:file.write(resp.data)resp.release_conn()wgetlinux系统有wget命令,大家可以轻松下载网上资源,Python中有对应的wget模块。使用pipinstall命令安装importwget#Imagefrombing.com'pic_wget.jpg')也可以直接在命令行使用wget命令python-mwgethttps://cn.bing.com/th?id=OHR.DerwentIsle_EN-CN8738104578_400x240.jpg分块下载需要下载的大文件如果文件很大,电脑内存不够,可以使用requests模块的stream方式。默认stream参数为False,文件过大导致内存不足。当stream参数为True时,请求不会立即开始下载。iter_content只有在调用iter_content或iter_lines遍历内容时才会下载。#vscode客户端url='https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe'withrequests.get(url,stream=True)asr:withopen('vscode.exe','wb')asflie:#chunk_size指定写入大小,写入1024*1024字节为chunkinr.iter_content(chunk_size=1024*1024):ifchunk:flie.write(chunk)进度条下载大文件时添加进度条美化下载界面。您可以实时了解下载的网络速度和下载的文件大小。这里使用tqdm模块作为进度条显示。可以使用pipinstalltqdm安装fromtqdmimporttqdmdeftqdm_download():url='https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe'resp=requests.get(url,stream=True)#获取文件大小file_size=int(resp.headers['content-length'])withtqdm(total=file_size,unit='B',unit_scale=True,unit_divisor=1024,ascii=True,desc='vscode.exe')asbar:withrequests.get(url,stream=True)asr:withopen('vscode.exe','wb')asfp:forchunkinr.iter_content(chunk_size=512):ifchunk:fp.write(chunk)bar.update(len(chunk))tqdm参数说明:total:bytes,整个文件sizeunit='B':以字节为单位计算unit_scale=True:以M为单位显示速度unit_divisor=1024:将文件大小和速度除以1024,默认除以1000ascii=True:显示进度条的符号,用于兼容windows系统desc='vscode.exe'进度条前面的文件名恢复HTTP/1.1协议的请求头中增加了一个名为Range的字段。Range字段允许下载文件如果网站支持Range字段,则请求响应的状态码为206(PartialContent),否则为416(RequestedRangenotsatisfaction)RangeformatRange:[unit=firstbytepos]-[lastbytepos],即Range=起始字节位置-结束字节位置,单位:bytesAddRangetoheadersfromtqdmimporttqdmdefduan_download():url='https://vscode.cdn.azure.cn/stable/e5a624b788d92b8d34d1392e4c4d9789406efe8f/VSCodeUserSetup-x64-1.51.1.exe'r=requests.get(url,stream=True)#获取文件大小file_size=int(r.headers['content-length'])file_name='vscode.exe'#如果文件存在,获取文件大小,ifnot从0开始下载,first_byte=0ifos.path.exists(file_name):first_byte=os.path.getsize(file_name)#判断是否下载完成iffirst_byte>=file_size:return#Rangeadded到请求头header={"Range":f"bytes={first_byte}-{file_size}"}#添加了一个初始参数tqdm(total=file_size,unit='B',initial=first_byte,unit_scale=True,unit_divisor=1024,ascii=True,desc=file_name)asbar:#添加headers参数withrequests.get(url,headers=header,stream=True)asr:withopen(file_name,'ab')asfp:forchunkinr.iter_content(chunk_size=512):ifchunk:fp.write(chunk)bar.update(len(chunk))开始下载一段时间后,关闭脚本重新运行,文件会断线后继续下载内容总结Th是文章介绍了常用的7种文件下载方法,其他下载方法,可以在留言区一起交流,共同进步这就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享
