Python?requests下載文件的幾種常用方法(附代碼)
1. 基礎(chǔ)下載:
import requests
def download_file(url, save_path):
response = requests.get(url, stream=True)
if response.status_code == 200:
with open(save_path, 'wb') as f:
f.write(response.content)
return True
return False
# 使用示例
url = "https://example.com/file.pdf"
download_file(url, "file.pdf")
2. 大文件分塊下載:
import requests
from tqdm import tqdm
def download_large_file(url, save_path):
response = requests.get(url, stream=True)
if response.status_code == 200:
file_size = int(response.headers.get('content-length', 0))
# 顯示進(jìn)度條
progress = tqdm(response.iter_content(chunk_size=8192),
total=file_size,
unit='B',
unit_scale=True)
with open(save_path, 'wb') as f:
for data in progress:
f.write(data)
return True
return False
3. 帶有斷點(diǎn)續(xù)傳的下載:
import requests
import os
def resume_download(url, save_path):
# 獲取已下載文件大小
initial_pos = os.path.getsize(save_path) if os.path.exists(save_path) else 0
# 設(shè)置 Header
headers = {'Range': f'bytes={initial_pos}-'}
response = requests.get(url, stream=True, headers=headers)
# 追加模式打開文件
mode = 'ab' if initial_pos > 0 else 'wb'
with open(save_path, mode) as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
4. 帶有超時(shí)和重試的下載:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import time
def download_with_retry(url, save_path, max_retries=3, timeout=30):
session = requests.Session()
# 設(shè)置重試策略
retries = Retry(total=max_retries,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504])
session.mount('http://', HTTPAdapter(max_retries=retries))
session.mount('https://', HTTPAdapter(max_retries=retries))
try:
response = session.get(url, stream=True, timeout=timeout)
with open(save_path, 'wb') as f:
for chunk in response.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
return True
except Exception as e:
print(f"Download failed: {str(e)}")
return False
5. 完整的下載器實(shí)現(xiàn):
import requests
from tqdm import tqdm
import os
from pathlib import Path
import hashlib
class FileDownloader:
def __init__(self, chunk_size=8192):
self.chunk_size = chunk_size
self.session = requests.Session()
def get_file_size(self, url):
response = self.session.head(url)
return int(response.headers.get('content-length', 0))
def get_file_hash(self, file_path):
sha256_hash = hashlib.sha256()
with open(file_path, "rb") as f:
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
def download(self, url, save_path, verify_hash=None):
save_path = Path(save_path)
# 創(chuàng)建目錄
save_path.parent.mkdir(parents=True, exist_ok=True)
# 獲取文件大小
file_size = self.get_file_size(url)
# 設(shè)置進(jìn)度條
progress = tqdm(total=file_size,
unit='B',
unit_scale=True,
desc=save_path.name)
try:
response = self.session.get(url, stream=True)
with save_path.open('wb') as f:
for chunk in response.iter_content(chunk_size=self.chunk_size):
if chunk:
f.write(chunk)
progress.update(len(chunk))
progress.close()
# 驗(yàn)證文件完整性
if verify_hash:
downloaded_hash = self.get_file_hash(save_path)
if downloaded_hash != verify_hash:
raise ValueError("File hash verification failed")
return True
except Exception as e:
progress.close()
print(f"Download failed: {str(e)}")
if save_path.exists():
save_path.unlink()
return False
def download_multiple(self, url_list, save_dir):
results = []
for url in url_list:
filename = url.split('/')[-1]
save_path = Path(save_dir) / filename
success = self.download(url, save_path)
results.append({
'url': url,
'success': success,
'save_path': str(save_path)
})
return results
# 使用示例
downloader = FileDownloader()
# 單文件下載
url = "https://example.com/file.pdf"
downloader.download(url, "downloads/file.pdf")
# 多文件下載
urls = [
"https://example.com/file1.pdf",
"https://example.com/file2.pdf"
]
results = downloader.download_multiple(urls, "downloads")總結(jié)
到此這篇關(guān)于Python requests下載文件的幾種常用方法的文章就介紹到這了,更多相關(guān)Python requests下載文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python機(jī)器學(xué)習(xí)基礎(chǔ)特征工程算法詳解
這篇文章主要為大家介紹了python機(jī)器學(xué)習(xí)基礎(chǔ)特征工程的算法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
Python2和Python3讀取文本文件的區(qū)別及說明
這篇文章主要介紹了Python2和Python3讀取文本文件的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
簡單了解Python下用于監(jiān)視文件系統(tǒng)的pyinotify包
這篇文章主要介紹了Python下用于監(jiān)視文件系統(tǒng)的pyinotify包,pyinotify基于inotify事件驅(qū)動(dòng)機(jī)制,需要的朋友可以參考下2015-11-11
Python實(shí)現(xiàn)的破解字符串找茬游戲算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)的破解字符串找茬游戲算法,簡單分析了找茬游戲的原理,并結(jié)合具體實(shí)例形式分析了Python實(shí)現(xiàn)破解找茬游戲的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-09-09
Python字符串格式化str.format()方法的實(shí)現(xiàn)
字符串的格式化是一個(gè)非常重要的功能,用于創(chuàng)建包含變量值的字符串,本來就來介紹一下Python字符串格式化str.format()方法的實(shí)現(xiàn),感興趣的可以了解一下2023-11-11
Python實(shí)現(xiàn)線性搜索算法的示例代碼
線性搜索算法,也稱為順序搜索算法,是一種簡單但常用的搜索技術(shù),在本文中,將深入研究線性搜索算法,并演示如何在?Python?中實(shí)現(xiàn)它,需要的可以參考下2024-02-02

