Python中requests庫的學(xué)習(xí)方法詳解
前言
好記性不如爛筆頭!最近在接口測(cè)試,以及爬蟲相關(guān),需要用到Python中的requests庫,之前用過,但是好久沒有用又忘了,這次就把這塊的簡單整理下(個(gè)人筆記使用)
一 URL,URI和URN
1. URL,URI和URN
URI的全稱是Uniform Resource Identiferm,即統(tǒng)一資源標(biāo)識(shí)符,它標(biāo)記了一個(gè)資源,比如http://www.baidu.com/ 就代表了一個(gè)百度網(wǎng)頁。
URL的全稱是Uniform Resource Locator,即統(tǒng)一資源定位符,是可以通過給出的路徑和文件去找到對(duì)應(yīng)的資源,比如 http://tougao.jb51.net/index.php?c=index&a=login&forward=http%3A%2F%2Ftougao.jb51.net%2F 這個(gè)URL就具體定位了一個(gè)資源,是可以根據(jù)路徑去實(shí)時(shí)找到資源的。
URN的全稱是Uniform Resource Name,即統(tǒng)一資源名稱;它只命名資源,不指定任何路徑去定位資源。
三者關(guān)系:URI包含URL,URN,即URL,URN是URI的子集。如果URI是一棟房的話,那URL是某個(gè)具體的房間(123號(hào)房),URN可以是房里某個(gè)東西(凳子),但不知道這個(gè)東西(凳子)具體在哪。如下
2. URL的組成
常見URL的組成一般如下,用這個(gè)URL做一下分析:http://tougao.jb51.net/index.php?c=index&a=login&forward=http%3A%2F%2Ftougao.jb51.net%2F
1 協(xié)議:用于訪問資源的協(xié)議,如上面用的是https協(xié)議進(jìn)行訪問,其它還有http,ftp等協(xié)議
2 服務(wù)器的主機(jī)地址:可以是域名,也可以是IP地址。如上面是域名editor.csdn.net訪問
3 端口:服務(wù)器設(shè)置的訪問端口。不過URL地址里一般無端口,因?yàn)榉?wù)器使用了協(xié)議的默認(rèn)端口,用戶通過url訪問服務(wù)器時(shí),可以省略。如http默認(rèn)端口是80,https默認(rèn)端口是443,ftp默認(rèn)端口是22等。
4 路徑:資源存放的路徑。一般是域名后的/到?之間的內(nèi)容,如上就是md
5 參數(shù):具體的查詢方式,如上面的URL的參數(shù)就是not_checkout=1&articleId=122388528
二 請(qǐng)求組成
請(qǐng)求一般是由客戶端向服務(wù)器端發(fā)起的,由4部分組成:請(qǐng)求方法(Request Method),網(wǎng)站(URL),請(qǐng)求頭(Request Headers)和 請(qǐng)求體(Request Body)。下面詳細(xì)整理下最常見的get請(qǐng)求和post請(qǐng)求。
1. 請(qǐng)求方法
常見的請(qǐng)求方法如下
- GET:請(qǐng)求頁面,數(shù)據(jù)包含在URL里面
- POST:大多用于提交表單或者上傳文件,數(shù)據(jù)包含在請(qǐng)求體中
- HEAD:類似GET請(qǐng)求,不過響應(yīng)報(bào)文沒有具體的內(nèi)容,用于獲取報(bào)頭
- PUT:用客戶端傳送的數(shù)據(jù)取代指定的內(nèi)容
- DELETE:請(qǐng)求服務(wù)器刪除指定的頁面
- CONNECT:把服務(wù)器當(dāng)作跳板,讓服務(wù)器代替客戶端訪問其他網(wǎng)頁
- OPTIONS:允許客戶端查看服務(wù)器的性能
- TRACE:回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或者診斷
不過我們見到和使用的大多數(shù)都是GET和POST請(qǐng)求
2. 請(qǐng)求網(wǎng)址
請(qǐng)求的網(wǎng)址即上面說的URL
3. 請(qǐng)求頭
請(qǐng)求頭,一般是傳送服務(wù)器需要的一些附加信息,其中比較重要的就是User-Agent,Referer,Cookie等,常用的請(qǐng)求有說明如下
- Accept: 請(qǐng)求報(bào)頭域,用于指定客戶端可接受哪些類型的信息
- Accept-Language: 指定客戶端可接受的語言類型
- Accept-Encoding: 指定客戶端可接受的編碼
- Host:用于指定資源主機(jī)的IP和端口號(hào),其內(nèi)容為請(qǐng)求URL的原始服務(wù)器或網(wǎng)關(guān)的位置
- Cookie:網(wǎng)站為了辨別用戶進(jìn)行會(huì)話跟蹤而存儲(chǔ)在用戶本地的數(shù)據(jù),它的主要功能是維持當(dāng)前訪問會(huì)話。
- Referer: 用來標(biāo)識(shí)這個(gè)請(qǐng)求是從哪個(gè)頁面發(fā)過來的,服務(wù)器可以拿到這一信息并做相應(yīng)的處理,如做資源統(tǒng)計(jì),防盜鏈接處理等。
- User-Agent: 可以是服務(wù)器識(shí)別客戶端使用的操作系統(tǒng)及版本,瀏覽器及版本信息等。所以在做爬蟲時(shí)要加上此信息,可以偽裝瀏覽器;不加的話很容易被識(shí)別為爬蟲。
- Conten-Type:互聯(lián)網(wǎng)媒體類型,用來表示具體請(qǐng)求中媒體類型信息;如text/html代表HTML格式,image/gif代表GIF圖片,application/json代表JSON類型
4. 請(qǐng)求體
請(qǐng)求體一般POST請(qǐng)求的時(shí)候才會(huì)有,因?yàn)镚ET請(qǐng)求的信息都在URL里。
三 請(qǐng)求
1. get請(qǐng)求
如果我們要發(fā)起一個(gè)GET請(qǐng)求,直接調(diào)用requests庫里的GET方法即可,如下
- get請(qǐng)求時(shí),請(qǐng)求參數(shù)一般放在URL里面,數(shù)據(jù)可以在URL里面看到
import requests #get(url) res = requests.get('http://httpbin.org/get') print(res.text)
請(qǐng)求網(wǎng)站是 http://httpbin.org/get,它會(huì)識(shí)別我們發(fā)起的是get請(qǐng)求,并返回對(duì)應(yīng)的信息。如下
不過不加請(qǐng)求頭的話容易被禁止訪問,訪問知乎https://www.zhihu.com/ 如下
import requests #get(url) res = requests.get('http://httpbin.org/get') res1 = requests.get('https://www.zhihu.com/') print(res1.text)
2. get帶請(qǐng)求頭headers參數(shù)
上面看見了,如果我們不構(gòu)造請(qǐng)求頭headers的話,容易被禁止訪問,因?yàn)闉g覽器有反爬措施,如下
import requests #get(url,headers) res1 = requests.get('https://www.zhihu.com/') print(res1.text) for i in res1.request.headers.items(): print(i)
結(jié)果返回403(禁止訪問),因?yàn)闉g覽器會(huì)通過User-Agent參數(shù)了解到我們的電腦系統(tǒng)以及瀏覽器等信息,上面不帶headers時(shí),默認(rèn)User-Agent為python-requests/2.22.0,這服務(wù)器一看就知道是腳本,那肯定就會(huì)禁止訪問。這時(shí)就需要重新構(gòu)造請(qǐng)求頭,偽裝成瀏覽器訪問,如下
將上面的user-agent
值用代碼傳送,如下
import requests #get(url,headers) headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36' } res1 = requests.get('https://www.zhihu.com/', headers=headers) print(res1.status_code) for i in res1.request.headers.items(): print(i)
如上,重新構(gòu)造請(qǐng)求頭傳了user-agent參數(shù)后,請(qǐng)求就成功了,user-agent也是我們傳進(jìn)去的值。
3. post請(qǐng)求
對(duì)于post請(qǐng)求,使用requests庫發(fā)起也是很簡單的,如下
import requests data = {'name': 'anxiaochong', 'age': 24} res = requests.post('http://httpbin.org/post', data=data) print(res.status_code) print(res.text)
對(duì)于post請(qǐng)求來說,它的數(shù)據(jù)在URL里面是看不到的,數(shù)據(jù)一般存放在請(qǐng)?bào)w中,如上,我們發(fā)起一個(gè)post請(qǐng)求,請(qǐng)求參數(shù)是data,當(dāng)我們請(qǐng)求成功后,它會(huì)返回如下信息。
四 響應(yīng)
當(dāng)我們發(fā)起請(qǐng)求之后,如果一切正常,就會(huì)得到相應(yīng)的響應(yīng)。我們的最終目的,就是要獲取返回的數(shù)據(jù),所以對(duì)返回的數(shù)據(jù)進(jìn)行處理是非常重要的。
1. 響應(yīng)狀態(tài)碼
狀態(tài)碼能夠最基本的判定服務(wù)器對(duì)請(qǐng)求的響應(yīng)情況,比如200就是請(qǐng)求成功,301就是重定向,404就是請(qǐng)求資源不存在,500就是服務(wù)器錯(cuò)誤等,常見的一些如下
200:請(qǐng)求成功,服務(wù)器已成功處理請(qǐng)求。
301: 重定向,請(qǐng)求的網(wǎng)頁已經(jīng)移動(dòng)到新位置
400: 請(qǐng)求錯(cuò)誤401: 未授權(quán),請(qǐng)求沒有進(jìn)行身份驗(yàn)證或者驗(yàn)證未通過
403: 禁止訪問404:未找到,請(qǐng)求資源不存在500:服務(wù)器錯(cuò)誤
503:服務(wù)器無法使用
python獲取響應(yīng)狀態(tài)碼如下
#獲取響應(yīng)狀態(tài)碼 import requests data = {'name': 'anxiaochong', 'age': 24} res = requests.post('http://httpbin.org/post', data=data) #獲取響應(yīng)狀態(tài)碼 print(res.status_code)
2. 響應(yīng)頭
響應(yīng)頭包含了服務(wù)器對(duì)請(qǐng)求的一些應(yīng)答信息,如Server,Content-Type,Set-cookie等信息。如下
content-type
: 返回?cái)?shù)據(jù)的類型sever
:服務(wù)器名稱,版本等信息set-cookie
: 會(huì)話cookie,下次請(qǐng)求需要帶上。
3. 響應(yīng)體
響應(yīng)信息中最重要的當(dāng)屬響應(yīng)體了,因?yàn)槲覀兿胍@取的信息基本都在里面。python的request庫也有對(duì)應(yīng)的方法了提取相關(guān)信息,如下
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36', 'Cookie': '_zap=cdbd7845-adac-4d87-ad39-2c6ce8fddde3; _xsrf=kD16ApICYLVrAfyvuW45BRI6jkdo4NcX; d_c0="ABDfdUZbRhSPTmuW3ExXOv346BuMqQ2oWaI=|1641098931"; __snaker__id=P7yktK5PgsCmILtR; gdxidpyhxdE=r9dW%2F%2BxGfN1iooAQAiODTGfGh8mPnu43T4g3V7PKabUA7zMCUUys%5CWvuLdjQeB5r8MZAtwRAOKJUQgJonmDPkpo6C4CxSXwNAP%2FMUa1p52udf%5Cu5eqEoiM%5C5QlGEMdgp3PwqG5uSMvzKyXA5WjmVejZdMmvaqwy8Y7MT1SrgLpf0hG3Q%3A1641099836676; _9755xjdesxxd_=32; YD00517437729195%3AWM_NI=VXux5u3T%2BJ6a%2FwURu60bvpw8ui4mkL1mk0xGQnAgn4UlLc5lq9n%2Fq4nkL9dYlDDOpT8bbuEZZueOScQMFx9h6t9pFTxKkjpVf74kC5EdQT6WJ0AsLoU%2FtsViMqPMk64rVjE%3D; YD00517437729195%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee87e9699686839bdc73b2868ea2d54a839f9eaeb62183bb8ca7f839968f008cf92af0fea7c3b92a9688bb99b87ff18ce5abb56beda99bb3f83ef4beba91f634b7b7fc8eea48f3b3a5d1fb4d93b28f88ed4097b48484b868b3e7a2d0f440aeb584dae753b09c8cb0f360fcbeae96c8529aababb0d26993938a99bc64f6acf791c560bc95a58bf35ea6e9fc8cc23f87bc9fb5b55d8af08f94cf6597f1bc94d5638fafa0aeea3ef8ae9a8bc837e2a3; YD00517437729195%3AWM_TID=gBk1e8TwlKhAABAAUBN6rQOGA%2FnBFhk3; l_cap_id="ODdjYzkzYjc3ODRlNGU5ZGFhZGNlODZjNmVhZjUxOTk=|1641098947|5e1742f2cfb1bc51e01c98dc554a343834ceb4fe"; r_cap_id="NWJjZTUwNzI3NTZkNGRlOGE2MDc4NjZhNTljMjQwMTE=|1641098947|34aeb872f7b2def674441346a0be809d4d3f3818"; cap_id="YThjNTkwZTZiMjY5NGNiNWJmOWJkYjQzNDRjMWE5MDA=|1641098947|7f4062306951584cd44180c28bb8a8fe90d732cd"; captcha_session_v2="2|1:0|10:1641099110|18:captcha_session_v2|88:THV2VWV1eWhIZUZTZmsvR1Yyd2hHRGNPcFc5QTc4bWNHNWVabzBDZ3JPZFRtUDltenRWeE1SUEtuVEZwcTBHSg==|258d6e1ea988e9f89e94208600834adba972038afbbb273aacc3849fa44c2cf9"; z_c0=Mi4xR1ZYa0RRQUFBQUFBRU45MVJsdEdGQmNBQUFCaEFsVk5sMzItWWdEc09nbTQzZWhiejkwTGhyZTRadE1WSlVEeXZR|1641099159|763c9639b7d621f1e9a64d0e246cec75292d7277; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1641098932,1641217361; tst=h; SESSIONID=gMeSnpcPawUbmk3tMHN6I6Uc2xxUTfnKfx4Pj7xHJ4Z; JOID=VVkVA0wgiAleIRrUbidunj5sRpR9QcRsCk9stj5B-V08S3HhGwmh6jgnHdVpii0jv9C3ZZnJsok4l_oqAxMoR7k=; osd=UVoSCkwkiw5XIR7XaS5umj1rT5R5QsNlCktvsTdB_V47QnHlGA6o6jwkGtxpji4kttCzZp7Aso07kPMqBxAvTrk=; NOT_UNREGISTER_WAITING=1; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1642866191; KLBRSID=fe0fceb358d671fa6cc33898c8c48b48|1642866207|1642866103' } res = requests.get('https://www.zhihu.com/hot', headers=headers) print("響應(yīng)狀態(tài)碼:", res.status_code) print("響應(yīng)內(nèi)容: ", res.text) print("獲取的響應(yīng)內(nèi)容類型: ", type(res.text)) print("響應(yīng)頭信息: ", res.headers) print("獲取請(qǐng)求頭信息: ", res.request.headers) print("獲取請(qǐng)求體: ", res.request.body) print("獲取cookie: ", res.cookies) print("cookie類型: ", type(res.cookies)) print("獲取編碼格式: ", res.encoding) print("獲取請(qǐng)求URL: ", res.url)
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
自動(dòng)化測(cè)試時(shí)基于Python常用的幾個(gè)加密算法總結(jié)
這幾天做自動(dòng)化測(cè)試,遇到一個(gè)問題,那就是接口的請(qǐng)求的密碼是加密的,產(chǎn)品的要求是不能使用使用其他特殊手段,他給提供加密算法,需要在接口請(qǐng)求的時(shí)候,使用加密算法處理后的數(shù)據(jù)傳參,本文主要是整理了幾個(gè)加密算法,以便后續(xù)測(cè)試使用,需要的朋友可以參考下2023-12-12Python機(jī)器學(xué)習(xí)應(yīng)用之基于BP神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)篇詳解
BP(back?propagation)神經(jīng)網(wǎng)絡(luò)是1986年由Rumelhart和McClelland為首的科學(xué)家提出的概念,是一種按照誤差逆向傳播算法訓(xùn)練的多層前饋神經(jīng)網(wǎng)絡(luò),是應(yīng)用最廣泛的神經(jīng)網(wǎng)絡(luò)模型之一2022-01-01PyTorch 對(duì)應(yīng)點(diǎn)相乘、矩陣相乘實(shí)例
今天小編就為大家分享一篇PyTorch 對(duì)應(yīng)點(diǎn)相乘、矩陣相乘實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12詳解如何使用SQLAlchemy連接數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了如何使用 SQLAlchemy 連接數(shù)據(jù)庫、建立模型、操作表、以及查詢操作表數(shù)據(jù)等內(nèi)容,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11Python實(shí)例方法、類方法、靜態(tài)方法的區(qū)別與作用詳解
這篇文章主要介紹了Python實(shí)例方法、類方法、靜態(tài)方法的區(qū)別與作用,結(jié)合實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中實(shí)例方法、類方法、靜態(tài)方法的概念、原理、用法及相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Python?echarts實(shí)現(xiàn)數(shù)據(jù)可視化實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了Python?echarts實(shí)現(xiàn)數(shù)據(jù)可視化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03python自動(dòng)化測(cè)試selenium操作下拉列表實(shí)現(xiàn)
這篇文章主要為大家介紹了python自動(dòng)化測(cè)試selenium操作下拉列表實(shí)現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11