http請(qǐng)求是常見的一種網(wǎng)頁(yè)協(xié)議,我們看到的各種網(wǎng)頁(yè),其實(shí)都是發(fā)送了http請(qǐng)求得到了服務(wù)器的響應(yīng),從而將數(shù)據(jù)庫(kù)中復(fù)雜的數(shù)據(jù)以簡(jiǎn)單、直觀的方式呈現(xiàn)出來,方便大眾閱讀、使用。而如何發(fā)送http請(qǐng)求呢?今天來探討一下使用requests模塊,達(dá)到高效、簡(jiǎn)單的http請(qǐng)求操作。
2 什么是requestsrequests是用python語(yǔ)言基于urllib編寫的,采用的是Apache2 Licensed開源協(xié)議的HTTP庫(kù),雖然標(biāo)準(zhǔn)庫(kù)中的urllib2模塊已經(jīng)包含了平時(shí)我們使用的大多數(shù)功能,但是urllib2的API使用起來并不太友好,而requests自稱“HTTP for Humans”,經(jīng)過高度封裝以后,可以直接調(diào)用此庫(kù)的相關(guān)函數(shù),非常方便幫助我們實(shí)現(xiàn)爬取HTML網(wǎng)頁(yè)頁(yè)面、模擬自動(dòng)提交網(wǎng)絡(luò)請(qǐng)求等操作。
requests模塊一直在迭代更新,以完全適應(yīng)當(dāng)前的所有網(wǎng)絡(luò)請(qǐng)求。
(資料圖)
支持的 HTTP 特性:
保持活動(dòng)和連接池國(guó)際域名和 URLCookie 持久性會(huì)話瀏覽器式 SSL 驗(yàn)證自動(dòng)內(nèi)容解碼基本 / 摘要身份驗(yàn)證優(yōu)雅的鍵 / 值 Cookie自動(dòng)減壓Unicode 響應(yīng)機(jī)構(gòu)HTTP(S)代理支持分段文件上傳流下載連接超時(shí)分塊請(qǐng)求.netrc 支持線程安全3 如何安裝安裝requests模塊與安裝其他python模塊一樣,使用pip命令安裝即可。
pip install requests# 如需指定版本pip install requests==2.27.14 如何使用4.1 七個(gè)主要方法4.2 HTTP協(xié)議對(duì)資源的操作4.3 響應(yīng)公共方法4.4 常用方式舉例4.4.1 requests.request()method:提交方式(get|post);
url:提交地址;
kwargs:14個(gè)控制訪問的參數(shù);
常用的參數(shù)有:params、data、json、headers、cookies,其他參數(shù)講解與示例將在(二)中進(jìn)行介紹。示例:
params:在url上傳遞的參數(shù),GET形式傳遞到后臺(tái)。import requestsrequests.request(method = "GET", url = "http://127.0.0.1:8080/example/request", # 字典data= { "k1" : "v1" , "k2" : "v2" , "x":[1,2,3]} # 字符串data="k1=v1&k2=v2&x=[1,2,3]"# 字節(jié)data = bytes("k1=v1&k2=k2&x=[1,2,3]", encoding="utf8") )# http://www.oldboyyede.com?k1=v1&k2=v2data:在請(qǐng)求體里面?zhèn)鬟f的數(shù)據(jù),后面可以是字典,字節(jié)等數(shù)據(jù)類型。import requestsrequests.request(method = "POST",url = "http://127.0.0.1:8080/example/request",# 字典data= { "k1" : "v1" , "k2" : "v2" , "x":[1,2,3]} # 字符串data="k1=v1&k2=v2&x=[1,2,3]"# 字節(jié)data = bytes("k1=v1&k2=k2&x=[1,2,3]", encoding="utf8")# 文件對(duì)象data = open("data_file.py", mode="r", encoding="utf-8"))json:在請(qǐng)求體里面?zhèn)鬟f數(shù)據(jù),把整體序列化成一個(gè)大字符串,字典中嵌套字典的話用JSON序列化。import requestsrequests.request( method = "POST", url = "http://127.0.0.1:8080/example/request", json = {"k1" : "v1", "k2" : "v2"} # "{ "k1" : "v1" , "k2" : "v2" }"# 字典嵌套字典json = json.dumps({"k1" : "v1" , "k2" : { "kk1" : vv1 }}))headers:在請(qǐng)求體中添加請(qǐng)求頭import requestsrequests.request(method="POST",url="http://127.0.0.1:8080/example/request",json={"k1": "v1", "k2": "v2"},headers={"Content-Type": "application/x-www-form-urlencoded"})cookies:在請(qǐng)求體中添加cookieimport requestsrequests.request(method="POST",url="http://127.0.0.1:8080/example/request",data={"k1": "v1", "k2": "v2"},cookies={"cookie_example": "cookie_value1"},)# 也可以使用CookieJar(字典形式就是在此基礎(chǔ)上封裝)from http.cookiejar import CookieJarfrom http.cookiejar import Cookieobj = CookieJar()# 構(gòu)建cookieobj.set_cookie(Cookie(version=0, name="c1", value="v1", port=None, domain="", path="/", secure=False, expires=None,discard=True, comment=None, comment_url=None, rest={"HttpOnly": None}, rfc2109=False,port_specified=False, domain_specified=False, domain_initial_dot=False, path_specified=False))# 發(fā)送請(qǐng)求requests.request(method="POST",url="http://127.0.0.1:8080/example/request",data={"k1": "v1", "k2": "v2"},cookies=obj)4.4.2 requests.get()構(gòu)造一個(gè)向服務(wù)器請(qǐng)求資源的request對(duì)象,然后返回一個(gè)包含服務(wù)器資源的response對(duì)象。
url:網(wǎng)址鏈接地址;
params:在url上傳遞的參數(shù),以GET形式傳遞到后臺(tái),可為字典或字節(jié)流格式;
kwargs:14個(gè)控制訪問的參數(shù);
示例:
import requests# 1、基本GET實(shí)例# 設(shè)置urlurl="http://127.0.0.1:8080/example/get"# 調(diào)用get方法發(fā)送請(qǐng)求response = requests.get(url)# 打印請(qǐng)求狀態(tài)碼print(response.status_code)# 打印響應(yīng)內(nèi)容print(response.text)# 打印編碼方式print(response.encoding)# 打印二進(jìn)制形式內(nèi)容print(response.content)# 2、帶參數(shù)與請(qǐng)求頭url = "http://127.0.0.1:8080/example/get"params = { "username": "admin" }header = {"User-Agent": "chrome"}# 將請(qǐng)求偽裝成谷歌瀏覽器chrome進(jìn)行訪問后的User-Agent,發(fā)送GET請(qǐng)求接口信息response = requests.get(url=url,params=params,headers=header)# 如接口返回?cái)?shù)據(jù)格式為json格式print(response.json())# 結(jié)果為:{ "code": 200, "msg": "請(qǐng)求成功", "data": [{...}] }4.4.3 requests.head()構(gòu)造一個(gè)向服務(wù)器請(qǐng)求資源的request對(duì)象,獲取HTML網(wǎng)頁(yè)頭信息。url:網(wǎng)址鏈接地址;
kwargs:14個(gè)控制訪問的參數(shù);
示例:
import requestsurl = "http://127.0.0.1:8080/example/get"response = requests.head(url)# 打印請(qǐng)求頭信息print(response.headers)注:部分網(wǎng)址請(qǐng)求時(shí),可能會(huì)遇到網(wǎng)絡(luò)防火墻,此時(shí)添加瀏覽器請(qǐng)求頭信息,可避免此類問題發(fā)生。
另外,在發(fā)送一些請(qǐng)求時(shí),如:網(wǎng)絡(luò)爬蟲時(shí),如不加headers,將會(huì)被網(wǎng)站識(shí)別出是python程序請(qǐng)求,可以使用真實(shí)的瀏覽器信息頭,模擬發(fā)生請(qǐng)求(警語(yǔ):請(qǐng)遵守爬蟲Robots協(xié)議)。
import requestsurl = "127.0.0.1:8080/example/get"header = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"response = requests.get(url=url, headers=header)# 打印請(qǐng)求狀態(tài)碼print(response.status_code)# 2004.4.4 requests.post()構(gòu)造一個(gè)向服務(wù)器請(qǐng)求資源的request對(duì)象,然后返回一個(gè)包含服務(wù)器資源的response對(duì)象。
url:網(wǎng)址鏈接地址;
kwargs:14個(gè)控制訪問的參數(shù);
示例:
# 1、基本POST實(shí)例import requestspayload = {"key1": "value1", "key2": "value2"}ret = requests.post("http://127.0.0.1:8080/example/post", data=payload)print(ret.text)# 2、發(fā)送請(qǐng)求頭和數(shù)據(jù)實(shí)例import requestsimport jsonurl = "http://127.0.1:8080/example/post"payload = {"some": "data"}headers = {"content-type": "application/json"}response = requests.post(url, data=json.dumps(payload), headers=headers)# 打印響應(yīng)內(nèi)容print(response.text)# 打印cookieprint(response.cookies)4.4.5 其他請(qǐng)求import requestsrequests.put(url, data=None, **kwargs)requests.head(url, **kwargs)requests.delete(url, **kwargs)requests.patch(url, data=None, **kwargs)requests.options(url, **kwargs)# 以上方法均是在此方法的基礎(chǔ)上構(gòu)建requests.request(method, url, **kwargs)5 本期常見問題1.打印text時(shí),出現(xiàn)亂碼答:1、查看是否正確配置encoding;2、查看是否為圖片,圖片數(shù)據(jù)為二進(jìn)制數(shù)據(jù),將圖片轉(zhuǎn)化為str的字符串類型,就會(huì)出現(xiàn)亂碼。2.打印content時(shí),出現(xiàn)“\x00\x00”等內(nèi)容:答:在python中,b開頭的內(nèi)容,表示為bytes類型的數(shù)據(jù)。
作者:京東物流駱銅磊
來源:京東云開發(fā)者社區(qū)