久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区

HTTP請求:Requests的進階使用方法淺析
來源:京東云開發者社區 責任編輯:武曉燕    時間:2023-06-28 11:46:33
1 背景

上篇文章講解了requests模塊的基礎使用,其中有get、put、post等多種請求方式,使用data、json等格式做為請求參數,在請求體中添加請求頭部信息的常見信息,如:headers、cookies,以及對請求響應的處理方法。接下來講解一下requests的高級用法。

2 進階方法舉例2.1 requests.request()

method:提交方式(get|post);url:提交地址;**kwargs:14個控制訪問的參數;


(資料圖)

常用的參數有:params、data、json、headers、cookies,已在上篇文章中介紹過了,感興趣的朋友,可以到上篇文章再回顧一下。以下將講解與示例其他參數的使用。

示例:

2.1.1 files

請求攜帶文件,如果有的請求需要上傳文件,可以用它來實現。

import requests# 上傳文件f= {"files": open("favicon.ico", "rb") }data = {"name": "上傳文件"}requests.request( method = "POST", url = "http://127.0.0.1:8080/example/request", data = data, files = f)

需注意:favicon.ico文件需和當前腳本在同一目錄下,如果不在,可以將文件名稱修改為文件路徑

import requestsfrom requests.auth import HTTPBasicAuth, HTTPDigestAuth# 1、Basic Auth認證res = requests.request( method = "GET", url = "http://127.0.0.1:8080/example/request", auth = HTTPBasicAuth("username", "password"))res.encoding = "gbk"print(res.status) # 200# 2、DIGEST 認證res = requests.request( method = "GET", url = "http://127.0.0.1:8080/example/request", auth = HTTPDigestAuth("username", "password"))res.encoding = "gbk"print(res.status) # 200

http auth認證的兩種方式,分別為Basic方式和Digest認證,其中:Basic Auth的優點是提供簡單的用戶驗證功能,其認證過程簡單明了,適合于對安全性要求不高的系統或設備中;同樣存在缺點:輸入的用戶名,密碼 base64編碼后會出現在Authorization里,很容易被解析出來。那么Digest對比Basic認證有什么不同呢?

Digest思想,是使用一種隨機數字符串,雙方約定好對哪些信息進行哈希運算,即可完成雙方身份的驗證。Digest模式避免了密碼在網絡上明文傳輸,提高了安全性,但它依然存在缺點,例如認證報文被攻擊者攔截到攻擊者可以獲取到資源。DIGEST 認證提供了高于 BASIC 認證的安全等級,但是和 HTTPS 的客戶端認證相比仍舊很弱。DIGEST 認證提供防止密碼被竊聽的保護機制,但并不存在防止用戶偽裝的保護機制。DIGEST 認證和 BASIC 認證一樣,使用上不那么便捷靈活,且仍達不到多數 Web 網站對高度安全等級的追求標準。因此它的適用范圍也有所受限。2.1.2 timeout

請求和響應的超時時間,在網絡響應延遲或者無響應時,可以通過設置超時時間,避免等待。

import requests# 設置請求超時1秒,1秒后無響應,將拋出異常,1秒為connect和read時間總和requests.request( method = "POST", url = "http://127.0.0.1:8080/example/request", json = {"k1" : "v1", "k2" : "v2"}, timeout = 1)# 分別設置connect和read的超時時間,傳入一個數組requests.request( method = "POST", url = "http://127.0.0.1:8080/example/request", json = {"k1" : "v1", "k2" : "v2"}, timeout = (5, 15))# 永久等待requests.request( method = "POST", url = "http://127.0.0.1:8080/example/request", json = {"k1" : "v1", "k2" : "v2"}, timeout = None # 或者刪除timeout參數)# 捕捉超時異常from requests.exceptions import ReadTimeouttry: res = requests.get("http://127.0.0.1:8080/example/request", timeout=0.1) print(res.status_code)except ReadTimeout: print("捕捉到超時異常")2.1.3 allow_redirects

設置重定向開關。

>>> import requests>>> r = requests.get("http://github.com")>>> r.url"https://github.com/">>> r.status_code200>>> r.history[]# 如果使用GET、OPTIONS、POST、PUT、PATCH或DELETE,則可以使用allow_redirects參數禁用重定向>>> r = requests.get("http://github.com", allow_redirects=False)>>> r.status_code301>>> r.history[]# 用HEAD啟動重定向>>> r = requests.head("http://github.com", allow_redirects=True)>>> r.url"https://github.com/">>> r.history[]import requestsimport re# 第一次請求r1=requests.get("https://github.com/login")r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授權)authenticity_token=re.findall(r"name="authenticity_token".*?value="(.*?)"",r1.text)[0] #從頁面中拿到CSRF TOKEN# 第二次請求:帶著初始cookie和TOKEN發送POST請求給登錄頁面,帶上賬號密碼data={ "commit":"Sign in", "utf8":"?", "authenticity_token":authenticity_token, "login":"xxxxxx@qq.com", "password":"password"}# 測試一:沒有指定allow_redirects=False,則響應頭中出現Location就跳轉到新頁面,# r2代表新頁面的responser2=requests.post("https://github.com/session", data=data, cookies=r1_cookie )print(r2.status_code) # 200print(r2.url) # 看到的是跳轉后的頁面print(r2.history) # 看到的是跳轉前的responseprint(r2.history[0].text) # 看到的是跳轉前的response.text# 測試二:指定allow_redirects=False,則響應頭中即便出現Location也不會跳轉到新頁面,# r2代表的仍然是老頁面的responser2=requests.post("https://github.com/session", data=data, cookies=r1_cookie, allow_redirects=False )print(r2.status_code) # 302print(r2.url) # 看到的是跳轉前的頁面https://github.com/sessionprint(r2.history) # []2.1.4 proxies

同添加headers方法一樣,代理參數是dict。

import requestsimport redef get_html(url): proxy = { "http": "120.25.253.234:812", "https" "163.125.222.244:8123" } heads = {} heads["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0" req = requests.get(url, headers=heads,proxies=proxy) html = req.text return htmldef get_ipport(html): regex = r"(.+)" iplist = re.findall(regex, html) regex2 = "(.+)" portlist = re.findall(regex2, html) regex3 = r"(.+)" typelist = re.findall(regex3, html) sumray = [] for i in iplist: for p in portlist: for t in typelist: pass pass a = t+","+i + ":" + p sumray.append(a) print("代理") print(sumray)if __name__ == "__main__": url = "http://www.baidu.com" get_ipport(get_html(url))

某些接口增加了防騷擾模式,對于大規模且頻繁的請求,可能會彈出驗證碼,或者跳轉到登錄驗證頁面,或者封禁IP地址,此時如果想要正常訪問,可以通過設置代理來解決這個問題。除了基本的HTTP代理外,requests還支持SOCKS協議的代理。

# 安裝socks庫pip3 install "requests[socks]"# 進行代理import requestsproxies = { "http": "socks5://user:password@host:port", "https": "socks5://user:password@host:port"}res = requests.get("http://www.baidu.com", proxies=proxies)print(res.status) # 2002.1.5 hooks

即鉤子方法,requests庫只支持一個response的鉤子,即在響應返回時,可以捎帶執行自定義方法。可以用于打印一些信息、做一些響應檢查、或者向響應中添加額外的信息。

import requestsurl = "http://www.baidu.com"def verify_res(res, *args, **kwargs): print("url", res.url) res.status="PASS" if res.status_code == 200 else "FAIL"res = requests.get(url, hooks={"response": verify_res})print(res.text) # print(res.status) # PASS2.1.6 stream

獲取內容立即下載開關,response會將報文一次性全部加載到內存中,如果報文過大,可以使用此參數,迭代下載。

import requestsurl="http://www.baidu.com"r = requests.get(url, stream=True)# 解析response_body,以\n分割for lines in r.iter_lines(): print("lines:", lines)# 解析response_body,以字節分割for chunk in r.iter_content(chunk_size=1024): print("chunk:", chunk)2.1.7 verify

認證SSL證書開關,當發送HTTPS請求的時候,如果該網站的證書沒有被CA機構信任,程序將報錯,可以使用verify參數控制是否檢查SSL證書。

# 1、直接設置import requestsresponse = requests.get("https://www.12306.cn", verify=False)print(response.status_code)# 2、請求時雖然設置了跳過檢查,但是程序運行時仍然會產生警告,警告中包含建議給我們的指定證書# 可以通過設置,忽略屏蔽這個警告from requests.packages import urllib3 # 如果報錯,則直接引入import urllib3# 3、屏蔽警告urllib3.disable_warnings()response = requests.get("https://www.12306.cn", verify=False)print(response.status_code) # 200# 4、通過cert直接聲明證書# 本地需要有crt和key文件(key必須是解密狀態,加密狀態的key是不支持的),并指定它們的路徑,response = requests.get("https://www.12306.cn",cert("/path/server.crt","/path/key"))print(response.status_code) # 2002.2 requests庫的異常

如何判斷是否出現異常呢?

2.2.1 raise_for_status()

該方法在內部判斷res.status_code是否等于200,不是則產生異常HTTPError示例:

# 1、HTTPError異常示例import requestsfrom requests.exceptions import HTTPErrortry: res = requests.post("http://127.0.0.1:8080/example/post") res.raise_for_status() # 等同于 if res.status != 200: raise HTTPError return resexcept HTTPError: return False2.2.2 ReadTimeout

該異常類型,將會捕捉到因請求/響應超時的請求。

# Timeout超時異常import requestsfrom requests.exceptions import ReadTimeouttry: res = requests.get("http://127.0.0.1:8080/example/post",timeout=0.5) print(res.status_code) return resexcept ReadTimeout: print("timeout")2.2.3 RequestException

該異常類型,將會捕捉到因無請求引起的異常請求。

# RquestError異常import requestsfrom requests.exceptions import RequestExceptiontry: res = requests.get("http://127.0.0.1:8080/example/post") print(res.status_code) return resexcept RequestException: print("reqerror")3 總結

看到這里,大家應該明白了,requests庫是一個比urilib2模塊更加簡潔的第三方庫,它具有如下的特點:

支持HTTP連接保持和連接池支持使用cookie、session保持會話支持文件上傳支持自動響應內容的編碼支持國際化的URL和Post數據自動編碼支持自動實現持久連接keep-alive

因此,requests這個高度封裝的模塊,可以使我們的HTTP請求,變得更加人性化,使用它將可以輕而易舉的完成瀏覽器請求的任何操作,充分詮釋了它的口號:“HTTP for Humans”。

作者:京東物流 駱銅磊

來源:京東云開發者社區

關鍵詞:

X 關閉

X 關閉

久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区
午夜精品视频在线| 一区二区视频欧美| 欧美日本三区| 美国十次了思思久久精品导航| 一本色道精品久久一区二区三区| 99re热这里只有精品免费视频| 亚洲淫片在线视频| 黄色成人免费网站| 亚洲免费婷婷| 狠狠入ady亚洲精品| 午夜精品www| 久久影视精品| 亚洲一区二区三区四区视频| 国模大胆一区二区三区| 国产精品你懂的在线| 欧美福利视频在线| 欧美一区二区视频在线观看| 牛夜精品久久久久久久99黑人| 另类欧美日韩国产在线| 欧美久久久久免费| 国产欧美日韩亚州综合| 一区二区三区视频在线看| 欧美a级片网站| 久久福利影视| 亚洲区在线播放| 麻豆精品91| 久久福利电影| 99这里只有久久精品视频| 国产精品天天摸av网| 亚洲色图综合久久| 狂野欧美一区| 亚洲一区二区在线免费观看| 性欧美xxxx视频在线观看| 另类国产ts人妖高潮视频| 国产性做久久久久久| 亚洲老板91色精品久久| 黄色成人免费网站| 久久精品亚洲| 中文欧美字幕免费| 欧美午夜欧美| 亚洲天堂久久| 欧美在线啊v一区| 国产精品揄拍一区二区| 亚洲国产精品女人久久久| 亚洲国产精品t66y| 久久国内精品视频| 国产精品久久久久久久久久久久久| 亚洲综合日韩在线| 欧美日本亚洲韩国国产| 国产精品天美传媒入口| 一区在线视频观看| 性久久久久久久久| 国产自产v一区二区三区c| 一区在线影院| 国产精品久久久久77777| 久久久亚洲高清| 久久精品毛片| 欧美日韩一区三区四区| 久久成人综合视频| 在线视频亚洲| 亚洲国产日韩精品| 国产精品视频精品| 欧美中文字幕第一页| 免费视频一区二区三区在线观看| 国产女人精品视频| 蜜桃伊人久久| 午夜精品久久久久久| 欧美成人在线网站| 老司机免费视频一区二区三区| 亚洲一区二区三区高清| 欧美freesex8一10精品| 欧美高清视频免费观看| 久久久精品国产99久久精品芒果| 亚洲丁香婷深爱综合| 在线精品视频在线观看高清| 国产精品激情电影| 亚洲视频1区| 在线视频日韩精品| 国产精品初高中精品久久| 亚洲精选在线观看| 国产欧美日韩亚州综合| 国内精品久久久久伊人av| 国产精品综合色区在线观看| 欧美一区激情| 久久久噜噜噜久久久| 久久精品亚洲国产奇米99| 亚洲国产午夜| 久久中文久久字幕| 久久国产一区二区三区| 国产日韩视频一区二区三区| 国产欧美日韩三区| 在线欧美电影| 亚洲日韩欧美视频| 久久久久久有精品国产| 在线精品亚洲| 国产精品99免视看9| 99热在线精品观看| 欧美一区二区性| 久久国产精品亚洲77777| 在线精品视频一区二区三四| 99在线观看免费视频精品观看| 狠狠色伊人亚洲综合成人| 国产欧美一区二区精品性| 国产原创一区二区| 国产麻豆综合| 国产欧美一区二区三区另类精品| 亚洲成在人线av| 黄色成人av在线| 亚洲三级电影在线观看| 欧美日韩亚洲一区在线观看| 国产精品激情| 欧美日韩在线另类| 欧美另类极品videosbest最新版本| 亚洲精品1区| 亚洲韩国日本中文字幕| 欧美激情在线播放| 欧美韩日亚洲| 久久精品国产免费看久久精品| 国产精品免费网站| 久久综合中文字幕| 欧美一区1区三区3区公司| 午夜精品久久久久久99热| 在线亚洲电影| 免费看成人av| 国产精品伦一区| 在线一区亚洲| 亚洲一区二区三区在线播放| 国产日韩欧美一区二区三区四区| 1024亚洲| 久久精品人人| 欧美成人精品一区二区三区| 亚洲精品一区在线观看| 国产精品日本一区二区| 欧美激情综合色综合啪啪| 欧美激情精品久久久久久| 国产精品视频内| 国产日产欧产精品推荐色| 欧美极品一区二区三区| 国产日韩欧美一区二区| 亚洲精品一区在线观看香蕉| 国产欧美精品日韩区二区麻豆天美| 好吊一区二区三区| 亚洲精品在线观看视频| 亚洲国产精品国自产拍av秋霞| 宅男噜噜噜66国产日韩在线观看| 欧美电影资源| 国产婷婷成人久久av免费高清| 国产精品成人av性教育| 欧美国产精品一区| 国产精品女主播在线观看| 亚洲一区二区三区免费视频| 欧美国产精品va在线观看| 国产精品久久久久影院亚瑟| 国产女主播在线一区二区| 亚洲综合成人在线| 亚洲一区二区三区精品动漫| 欧美精品www| 亚洲区一区二区三区| 亚洲国产精品一区二区www在线| 一区二区三区在线高清| 99国产精品久久久久久久| 久久国产免费看| 国产精品二区在线观看| 一区二区三区日韩在线观看| 欧美亚洲综合久久| 狠狠狠色丁香婷婷综合激情| 国产欧美日韩高清| 欧美电影免费观看大全| 国产精品美女久久久久久久| 一区二区三区波多野结衣在线观看| 午夜国产不卡在线观看视频| 欧美日韩中国免费专区在线看| 欧美一区二区三区在| 欧美黄色一区| 国产三级欧美三级日产三级99| 午夜精品99久久免费| 免费在线欧美黄色| 亚洲二区视频在线| 激情综合色综合久久| 欧美日韩黄色大片| 老司机精品视频网站| 免费不卡视频| 尤物99国产成人精品视频| 黄色资源网久久资源365| 国产精品h在线观看| 国产精品福利久久久| 在线国产亚洲欧美| 国产麻豆日韩| 一区二区三区三区在线| 久久久久久久综合色一本| 亚洲人成亚洲人成在线观看图片| 一区二区高清视频在线观看| 久久久国产一区二区| 国外成人性视频| 久久频这里精品99香蕉| 欧美午夜寂寞影院| 欧美久久影院| 久久综合色天天久久综合图片| 国产亚洲精品激情久久| 久久国产黑丝|