天天看點

Python之requests庫的學習(一)

文章目錄

        • 前言
    • 一 URL,URI和URN
        • 1. URL,URI和URN
        • 2. URL的組成
    • 二 請求組成
        • 1. 請求方法
        • 2. 請求網址
        • 3. 請求頭
        • 4. 請求體
    • 三 請求
        • 1. get請求
        • 2. get帶請求頭headers參數
        • 3. post請求
    • 四 響應
        • 1. 響應狀态碼
        • 2. 響應頭
        • 3. 響應體

前言

好記性不如爛筆頭!最近在接口測試,以及爬蟲相關,需要用到Python中的requests庫,之前用過,但是好久沒有用又忘了,這次就把這塊的簡單整理下(個人筆記使用)

一 URL,URI和URN

1. URL,URI和URN

URI的全稱是Uniform Resource Identiferm,即統一資源辨別符,它标記了一個資源,比如http://www.baidu.com/ 就代表了一個百度網頁。

URL的全稱是Uniform Resource Locator,即統一資源定位符,是可以通過給出的路徑和檔案去找到對應的資源,比如 https://blog.csdn.net/qq_44690947/article/details/120856354?spm=1001.2014.3001.5501 這個URL就具體定位了一個資源,是可以根據路徑去實時找到資源的。

URN的全稱是Uniform Resource Name,即統一資源名稱;它隻命名資源,不指定任何路徑去定位資源。

三者關系:URI包含URL,URN,即URL,URN是URI的子集。如果URI是一棟房的話,那URL是某個具體的房間(123号房),URN可以是房裡某個東西(凳子),但不知道這個東西(凳子)具體在哪。如下

Python之requests庫的學習(一)

2. URL的組成

常見URL的組成一般如下,用這個URL做一下分析:https://editor.csdn.net/md?not_checkout=1&articleId=122388528:

  • 1 協定:用于通路資源的協定,如上面用的是https協定進行通路,其它還有http,ftp等協定
  • 2 伺服器的主機位址:可以是域名,也可以是IP位址。如上面是域名editor.csdn.net通路
  • 3 端口:伺服器設定的通路端口。不過URL位址裡一般無端口,因為伺服器使用了協定的預設端口,使用者通過url通路伺服器時,可以省略。如http預設端口是80,https預設端口是443,ftp預設端口是22等。
  • 4 路徑:資源存放的路徑。一般是域名後的/到?之間的内容,如上就是md
  • 5 參數:具體的查詢方式,如上面的URL的參數就是not_checkout=1&articleId=122388528

二 請求組成

請求一般是由用戶端向伺服器端發起的,由4部分組成:請求方法(Request Method),網站(URL),請求頭(Request Headers)和 請求體(Request Body)。下面詳細整理下最常見的get請求和post請求。

1. 請求方法

常見的請求方法如下

  • GET:請求頁面,資料包含在URL裡面
  • POST:大多用于送出表單或者上傳檔案,資料包含在請求體中
  • HEAD:類似GET請求,不過響應封包沒有具體的内容,用于擷取報頭
  • PUT:用用戶端傳送的資料取代指定的内容
  • DELETE:請求伺服器删除指定的頁面
  • CONNECT:把伺服器當作跳闆,讓伺服器代替用戶端通路其他網頁
  • OPTIONS:允許用戶端檢視伺服器的性能
  • TRACE:回顯伺服器收到的請求,主要用于測試或者診斷

不過我們見到和使用的大多數都是GET和POST請求

2. 請求網址

請求的網址即上面說的URL

3. 請求頭

請求頭,一般是傳送伺服器需要的一些附加資訊,其中比較重要的就是User-Agent,Referer,Cookie等,常用的請求有說明如下

  • Accept: 請求報頭域,用于指定用戶端可接受哪些類型的資訊
  • Accept-Language: 指定用戶端可接受的語言類型
  • Accept-Encoding: 指定用戶端可接受的編碼
  • Host:用于指定資源主機的IP和端口号,其内容為請求URL的原始伺服器或網關的位置
  • Cookie:網站為了辨識使用者進行會話跟蹤而存儲在使用者本地的資料,它的主要功能是維持目前通路會話。
  • Referer: 用來辨別這個請求是從哪個頁面發過來的,伺服器可以拿到這一資訊并做相應的處理,如做資源統計,防盜連結處理等。
  • User-Agent: 可以是伺服器識别用戶端使用的作業系統及版本,浏覽器及版本資訊等。是以在做爬蟲時要加上此資訊,可以僞裝浏覽器;不加的話很容易被識别為爬蟲。
  • Conten-Type:網際網路媒體類型,用來表示具體請求中媒體類型資訊;如text/html代表HTML格式,image/gif代表GIF圖檔,application/json代表JSON類型

4. 請求體

請求體一般POST請求的時候才會有,因為GET請求的資訊都在URL裡。

三 請求

1. get請求

如果我們要發起一個GET請求,直接調用requests庫裡的GET方法即可,如下

  • get請求時,請求參數一般放在URL裡面,資料可以在URL裡面看到
import requests

#get(url)
res = requests.get('http://httpbin.org/get')
print(res.text)
           

請求網站是 http://httpbin.org/get,它會識别我們發起的是get請求,并傳回對應的資訊。如下

Python之requests庫的學習(一)

不過不加請求頭的話容易被禁止通路,通路知乎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)
           
Python之requests庫的學習(一)

2. get帶請求頭headers參數

上面看見了,如果我們不構造請求頭headers的話,容易被禁止通路,因為浏覽器有反爬措施,如下

import requests

#get(url,headers)
res1 = requests.get('https://www.zhihu.com/')
print(res1.text)
for i in res1.request.headers.items():
    print(i)
           
Python之requests庫的學習(一)

結果傳回403(禁止通路),因為浏覽器會通過User-Agent參數了解到我們的電腦系統以及浏覽器等資訊,上面不帶headers時,預設User-Agent為python-requests/2.22.0,這伺服器一看就知道是腳本,那肯定就會禁止通路。這時就需要重新構造請求頭,僞裝成浏覽器通路,如下

Python之requests庫的學習(一)

将上面的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)

           
Python之requests庫的學習(一)

如上,重新構造請求頭傳了user-agent參數後,請求就成功了,user-agent也是我們傳進去的值。

3. post請求

對于post請求,使用requests庫發起也是很簡單的,如下

import requests

data = {'name': 'anxiaochong', 'age': 24}
res = requests.post('http://httpbin.org/post', data=data)
print(res.status_code)
print(res.text)

           

對于post請求來說,它的資料在URL裡面是看不到的,資料一般存放在請體中,如上,我們發起一個post請求,請求參數是data,當我們請求成功後,它會傳回如下資訊。

Python之requests庫的學習(一)

四 響應

當我們發起請求之後,如果一切正常,就會得到相應的響應。我們的最終目的,就是要擷取傳回的資料,是以對傳回的資料進行處理是非常重要的。

1. 響應狀态碼

狀态碼能夠最基本的判定伺服器對請求的響應情況,比如200就是請求成功,301就是重定向,404就是請求資源不存在,500就是伺服器錯誤等,常見的一些如下

  • 200:請求成功,伺服器已成功處理請求。
  • 301: 重定向,請求的網頁已經移動到新位置
  • 400: 請求錯誤
  • 401: 未授權,請求沒有進行身份驗證或者驗證未通過
  • 403: 禁止通路
  • 404:未找到,請求資源不存在
  • 500:伺服器錯誤
  • 503:伺服器無法使用

    python擷取響應狀态碼如下

#擷取響應狀态碼
import requests

data = {'name': 'anxiaochong', 'age': 24}
res = requests.post('http://httpbin.org/post', data=data)
#擷取響應狀态碼
print(res.status_code)
           

2. 響應頭

響應頭包含了伺服器對請求的一些應答資訊,如Server,Content-Type,Set-cookie等資訊。如下

Python之requests庫的學習(一)
  • content-type: 傳回資料的類型
  • sever:伺服器名稱,版本等資訊
  • set-cookie: 會話cookie,下次請求需要帶上。

3. 響應體

響應資訊中最重要的當屬響應體了,因為我們想要擷取的資訊基本都在裡面。python的request庫也有對應的方法了提取相關資訊,如下

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("響應狀态碼:", res.status_code)
print("響應内容: ", res.text)
print("擷取的響應内容類型: ", type(res.text))
print("響應頭資訊: ", res.headers)
print("擷取請求頭資訊: ", res.request.headers)
print("擷取請求體: ", res.request.body)
print("擷取cookie: ", res.cookies)
print("cookie類型: ", type(res.cookies))
print("擷取編碼格式: ", res.encoding)
print("擷取請求URL: ", res.url)