Python實現(xiàn)文件下載、Cookie以及重定向的方法代碼
前言
本文主要介紹了如何使用 Python 的 requests 模塊進行網(wǎng)絡(luò)請求操作,涵蓋了從文件下載、Cookie 處理到重定向與歷史請求等多個方面。通過詳細的示例代碼,展示了如何高效地實現(xiàn)各種網(wǎng)絡(luò)操作,幫助開發(fā)者更輕松地進行 HTTP 請求的處理和數(shù)據(jù)管理。
一、下載網(wǎng)絡(luò)文件
(一)基本步驟
使用 requests.get() 方法可以發(fā)送 HTTP GET 請求,從給定的 URL 下載文件。以下是下載文件的典型步驟:
發(fā)送請求 使用 requests.get() 向文件的 URL 發(fā)送請求。
獲取文件內(nèi)容 響應(yīng)對象的 content 屬性包含文件的二進制數(shù)據(jù),可以將其保存到本地文件中。
保存文件 使用 with open() 創(chuàng)建一個本地文件,將下載的內(nèi)容寫入其中。
示例:
import requests
# 要下載的文件的 URL
url = 'https://example.com/sample.pdf'
# 發(fā)送 GET 請求
response = requests.get(url)
# 檢查請求是否成功
if response.status_code == 200:
# 以二進制模式打開一個文件,將文件內(nèi)容寫入本地
with open('sample.pdf', 'wb') as file:
file.write(response.content)
print("文件下載成功")
else:
print(f"文件下載失敗,狀態(tài)碼:{response.status_code}")
(二)分段下載大文件
如果文件比較大,建議使用分段下載方式。通過 iter_content() 方法,可以避免將整個文件一次性加載到內(nèi)存中,而是逐塊處理數(shù)據(jù),適合大文件下載。
示例:
import requests
# 要下載的文件的 URL
url = 'https://example.com/largefile.zip'
# 發(fā)送 GET 請求,流式獲取文件
response = requests.get(url, stream=True)
# 檢查請求是否成功
if response.status_code == 200:
# 以二進制模式打開一個文件,逐塊寫入數(shù)據(jù)
with open('largefile.zip', 'wb') as file:
for chunk in response.iter_content(chunk_size=1024):
if chunk: # 過濾掉保持活動的空數(shù)據(jù)塊
file.write(chunk)
print("大文件下載成功")
else:
print(f"文件下載失敗,狀態(tài)碼:{response.status_code}")
(三)常見問題
常見的問題主要有兩個:
1. 超時設(shè)置:可以使用 timeout 參數(shù)來避免請求長時間掛起。例如:
response = requests.get(url, timeout=10) # 設(shè)置10秒超時
2. 錯誤處理:建議添加異常處理來捕獲網(wǎng)絡(luò)錯誤。例如:
try:
response = requests.get(url)
response.raise_for_status() # 檢查請求是否成功
except requests.exceptions.RequestException as e:
print(f"請求失?。簕e}")
二、requests模塊處理Cookie
requests 模塊可以輕松地處理 HTTP 請求中的 Cookies,包括發(fā)送帶有 Cookie 的請求和在響應(yīng)中獲取 Cookie。以下是如何使用 requests 模塊處理 Cookies 的一些常見方法和操作示例。
(一)發(fā)送帶有 Cookies 的請求
在發(fā)送請求時,可以通過 cookies 參數(shù)向服務(wù)器發(fā)送 Cookie。這個參數(shù)接收一個字典形式的 Cookie 數(shù)據(jù),其中鍵是 Cookie 名稱,值是 Cookie 的值。
示例:
import requests
# 定義 Cookies
cookies = {
'session_id': '123456',
'user': 'john_doe'
}
# 發(fā)送帶有 Cookies 的請求
response = requests.get('https://example.com', cookies=cookies)
# 打印響應(yīng)內(nèi)容
print(response.text)
在這個示例中,session_id 和 user 是發(fā)送給服務(wù)器的 Cookie。
(二)從響應(yīng)中獲取 Cookies
服務(wù)器在響應(yīng)中也可以返回 Set-Cookie 頭,requests 模塊會自動將這些 Cookie 存儲在 response.cookies 屬性中。
示例:
import requests
# 發(fā)送請求
response = requests.get('https://example.com')
# 獲取響應(yīng)中的 Cookies
cookies = response.cookies
# 遍歷 Cookies
for cookie in cookies:
print(f"{cookie.name}: {cookie.value}")
response.cookies 是一個 RequestsCookieJar 對象,類似于字典,可以像訪問字典那樣訪問特定的 Cookie。
(三)Session 對象管理 Cookies
使用 requests.Session() 對象時,Cookies 會自動在不同的請求之間保存和發(fā)送。這在處理需要登錄認證的情況時非常有用,因為 Session 對象可以自動保持會話的狀態(tài)。
示例:
import requests
# 創(chuàng)建一個 Session 對象
session = requests.Session()
# 第一次請求,可能會設(shè)置 Cookies(例如登錄)
response = session.get('https://example.com/login')
# 在后續(xù)的請求中,Cookies 會自動發(fā)送
response = session.get('https://example.com/dashboard')
# 查看當(dāng)前 Session 中的 Cookies
print(session.cookies)
在這個示例中,session 對象會自動管理從響應(yīng)中接收到的 Cookies,并在后續(xù)請求中發(fā)送它們。這樣,可以保持一個會話(如登錄后的狀態(tài))。
(四)手動設(shè)置和修改 Cookies
如果想手動管理 Session 對象的 Cookies,可以通過 session.cookies.set() 方法來設(shè)置或修改 Cookies。
示例:
import requests
# 創(chuàng)建一個 Session 對象
session = requests.Session()
# 設(shè)置一個新的 Cookie
session.cookies.set('my_cookie', 'cookie_value')
# 發(fā)送請求,并自動附帶這個 Cookie
response = session.get('https://example.com')
# 打印響應(yīng)內(nèi)容
print(response.text)
(五)RequestsCookieJar 轉(zhuǎn)換為字典
response.cookies 返回的是一個 RequestsCookieJar 對象,可以將其轉(zhuǎn)換為一個普通的字典,便于后續(xù)處理。
示例:
# 將 Cookies 轉(zhuǎn)換為字典 cookies_dict = requests.utils.dict_from_cookiejar(response.cookies) print(cookies_dict)
(六)字典轉(zhuǎn)換為 RequestsCookieJar
可以將一個字典轉(zhuǎn)換為 RequestsCookieJar,這樣可以方便地管理 Cookie。
示例:
from requests.cookies import cookiejar_from_dict
# 定義 Cookies 字典
cookies_dict = {'session_id': '123456', 'user': 'john_doe'}
# 將字典轉(zhuǎn)換為 RequestsCookieJar
jar = cookiejar_from_dict(cookies_dict)
# 發(fā)送請求時使用這個 CookieJar
response = requests.get('https://example.com', cookies=jar)
(七)總結(jié)
發(fā)送 Cookie: 通過 cookies 參數(shù)傳遞字典。
獲取 Cookie: 通過 response.cookies 獲取服務(wù)器返回的 Cookie。
自動管理 Cookie: 使用 requests.Session() 可以在多個請求間自動管理 Cookie。
手動設(shè)置和修改: 通過 session.cookies.set() 手動設(shè)置 Cookies。
轉(zhuǎn)換 CookieJar 和字典: requests.utils.dict_from_cookiejar() 和 requests.cookies.cookiejar_from_dict() 方法可以互相轉(zhuǎn)換。
三、重定向與歷史請求
重定向 和 歷史請求 是常見的網(wǎng)絡(luò)請求處理需求。requests 模塊默認會自動處理 HTTP 重定向,并且提供了查看重定向歷史的功能。
(一)重定向的概念
重定向是指服務(wù)器告訴客戶端當(dāng)前請求的資源已經(jīng)移動到另一個 URL,客戶端需要訪問新的 URL。常見的重定向狀態(tài)碼包括:
301 Moved Permanently: 永久重定向,資源已永久搬遷到新的 URL。
302 Found: 臨時重定向,資源臨時搬遷,但客戶端應(yīng)繼續(xù)使用原始 URL。
303 See Other: 告訴客戶端請求的資源可以在另一個 URL 處使用 GET 請求獲取。
307 Temporary Redirect: 請求資源臨時搬遷,客戶端應(yīng)保留請求方法和數(shù)據(jù)。
308 Permanent Redirect: 類似于 301,但客戶端必須使用相同的請求方法。
(二)自動重定向
requests 模塊默認會自動處理重定向。如果服務(wù)器返回一個 3xx 響應(yīng),requests 會跟隨 Location 頭中的新 URL 進行重定向。你可以通過 response.history 查看重定向鏈中的所有請求。
示例:
import requests
# 發(fā)送一個可能發(fā)生重定向的請求
response = requests.get('http://example.com')
# 打印最終響應(yīng)的 URL
print(f"最終的 URL: {response.url}")
# 檢查重定向歷史
if response.history:
print("發(fā)生了重定向")
for resp in response.history:
print(f"狀態(tài)碼: {resp.status_code}, URL: {resp.url}")
else:
print("沒有發(fā)生重定向")
在這個例子中,response.history 是一個包含重定向歷史的列表,包含每次重定向的響應(yīng)對象,最終的響應(yīng)會保存在 response 中。
(三)禁止重定向
如果不希望自動跟隨重定向,可以通過 allow_redirects=False 禁用重定向。在這種情況下,requests 會返回重定向響應(yīng),但不會繼續(xù)跟隨。
示例:
import requests
# 禁止自動重定向
response = requests.get('http://example.com', allow_redirects=False)
# 查看響應(yīng)狀態(tài)碼和重定向的 URL
print(f"狀態(tài)碼: {response.status_code}")
if response.is_redirect or response.status_code in [301, 302, 303, 307, 308]:
print(f"重定向的 URL: {response.headers['Location']}")
如果服務(wù)器返回重定向狀態(tài)碼(如 301 或 302),Location 頭部中將包含重定向的新 URL,requests 將返回此信息而不會自動發(fā)起新的請求。
(四)POST 請求的重定向
當(dāng)發(fā)送 POST 請求時,如果遇到 302 或 303 重定向,requests 會自動將方法更改為 GET,以符合 HTTP 規(guī)范。
示例:
import requests
# 發(fā)送一個 POST 請求,并觸發(fā)重定向
response = requests.post('http://example.com/login', data={'username': 'user', 'password': 'pass'})
# 打印重定向后的請求方法
if response.history:
print(f"重定向后使用的請求方法: {response.request.method}")
在這種情況下,POST 請求可能會被重定向為 GET 請求。
(五)重定向鏈和歷史請求
可以通過 response.history 來查看每一次重定向的狀態(tài)碼和 URL,以跟蹤整個請求鏈。
示例:
import requests
# 發(fā)送一個可能發(fā)生多次重定向的請求
response = requests.get('http://example.com')
# 打印重定向鏈中的每個請求信息
for resp in response.history:
print(f"狀態(tài)碼: {resp.status_code}, URL: {resp.url}, 請求方法: {resp.request.method}")
(六)限制重定向次數(shù)
requests 模塊默認允許最多 30 次重定向。如果需要限制重定向次數(shù),可以通過 max_redirects 參數(shù)來控制。
示例:
import requests
# 限制最多重定向次數(shù)為 5
response = requests.get('http://example.com', max_redirects=5)
# 查看響應(yīng)狀態(tài)碼
print(f"最終的狀態(tài)碼: {response.status_code}")
如果重定向次數(shù)超過了設(shè)置的限制,requests 會拋出 TooManyRedirects 異常。
(七)總結(jié)
自動重定向: requests 默認會自動處理 3xx 重定向,并可通過 response.history 查看重定向鏈。
禁止重定向: 使用 allow_redirects=False 禁止自動重定向。
POST 請求重定向: 如果遇到 302 或 303 狀態(tài)碼,POST 請求會自動轉(zhuǎn)換為 GET 請求。
歷史請求: 通過 response.history 獲取每次重定向的狀態(tài)碼、URL 和請求方法,了解請求過程。
限制重定向次數(shù): 可以通過 max_redirects 限制最大重定向次數(shù),防止陷入無限重定向循環(huán)。
四、總結(jié)
通過 requests 模塊,開發(fā)者可以輕松實現(xiàn)文件下載、Cookie 自動管理以及處理重定向和歷史請求。本文通過清晰的步驟和代碼示例,展示了如何處理常見的網(wǎng)絡(luò)請求需求,并提供了應(yīng)對大文件下載、請求超時及多次重定向等復(fù)雜場景的解決方案,使網(wǎng)絡(luò)編程變得更加簡單和高效。
到此這篇關(guān)于Python實現(xiàn)文件下載、Cookie以及重定向的方法代碼的文章就介紹到這了,更多相關(guān)Python實現(xiàn)文件下載、Cookie以及重定向內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python將pandas datarame保存為txt文件的實例
今天小編就為大家分享一篇python將pandas datarame保存為txt文件的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02
pytorch實現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例)
今天小編就為大家分享一篇pytorch實現(xiàn)建立自己的數(shù)據(jù)集(以mnist為例),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Streamlit+Echarts實現(xiàn)繪制精美圖表
在數(shù)據(jù)分析和可視化的領(lǐng)域,選擇合適的工具可以讓我們事半功倍,本文主要為大家介紹兩個工具,Streamlit和ECharts,感興趣的小伙伴可以跟隨小編一起了解下2023-09-09
python編程簡單幾行代碼實現(xiàn)視頻轉(zhuǎn)換Gif示例
這篇文章主要為大家介紹了簡單使用幾行python代碼就可以實現(xiàn)將視頻轉(zhuǎn)換Gif的示例過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10
Python函數(shù)的作用域及內(nèi)置函數(shù)詳解
這篇文章主要介紹了python函數(shù)的作用域及內(nèi)置函數(shù)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2021-09-09

