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