整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          一篇文章帶你掌握requests基本用法

          一篇文章帶你掌握requests基本用法

          、requests簡介及安裝

          1. 簡介

          Requests庫是由python語言基于urllib編寫的,采用的是Apache2 Licensed開源協(xié)議的HTTP庫,它在做網(wǎng)絡(luò)請求上會比urllib使用更加方便。

          2. 安裝

          直接使用pip安裝即可

          pip install requests

          二、requests使用方法介紹

          1. 請求方式

          requests包含多種請求方式:

          1. GET- 請求頁面,并返回頁面內(nèi)容
          2. POST- 大多用于提交表單或上傳文件,數(shù)據(jù)包含在請求體中
          3. HEAD- 類似于GET請求,只不過返回的響應(yīng)中沒有具體的內(nèi)容,用于獲取報(bào)頭
          4. PUT- 從客戶端向服務(wù)器傳送的數(shù)據(jù)取代指定文檔中的內(nèi)容
          5. DELETE- 請求服務(wù)器刪除指定的頁面
          6. CONNECT- 把服務(wù)器當(dāng)作跳板,讓服務(wù)器代替客戶端訪問其他網(wǎng)頁
          7. OPTIONS- 允許客戶端查看服務(wù)器的性能
          8. TRACE- 回顯服務(wù)器收到的請求,主要用于測試或診斷

          2. 基本用法

          這里只介紹常用的GET請求和POST請求

          2.1 GET請求

          GET請求中的參數(shù)包含在URL里面,并且數(shù)據(jù)是明文的,可以在URL中看到。

          GET請求提交的數(shù)據(jù)最多只有1024字節(jié)。

          以實(shí)驗(yàn)網(wǎng)址為例(http://httpbin.org/get)

          基本請求:

          import requests

          __author__='Evan'

          r=requests.get(url='http://httpbin.org/get') # 使用GET請求訪問

          print(r.text) # 打印網(wǎng)頁的HTML文本

          打印結(jié)果:

          {

          "args": {},

          "headers": {

          "Accept": "*/*",

          "Accept-Encoding": "gzip, deflate",

          "Host": "httpbin.org",

          "User-Agent": "python-requests/2.22.0"

          },

          "origin": "12.192.229.251, 12.192.229.251",

          "url": "https://httpbin.org/get"

          }

          可以發(fā)現(xiàn),我們成功的發(fā)起了GET請求,返回結(jié)果中包含請求頭、URL、IP等信息。

          那么,對于GET請求,如果要附加額外的信息,要怎么添加呢?

          使用params參數(shù)構(gòu)造帶請求參數(shù)的GET請求:

          import requests

          __author__='Evan'

          # 請求參數(shù)

          params={

          'name': 'Evan',

          'age': '24'

          }

          r=requests.get(url='http://httpbin.org/get', params=params) # 帶請求參數(shù)的GET請求

          print(r.text)

          打印結(jié)果:

          {

          "args": {

          "age": "24",

          "name": "Evan"

          },

          "headers": {

          "Accept": "*/*",

          "Accept-Encoding": "gzip, deflate",

          "Host": "httpbin.org",

          "User-Agent": "python-requests/2.22.0"

          },

          "origin": "12.192.229.251, 12.192.229.251",

          "url": "https://httpbin.org/get?name=Evan&age=24"

          }

          可以看到設(shè)置的params參數(shù)已經(jīng)起作用了,不過還有一種方法也可以提供請求參數(shù),就是構(gòu)建完整的URL,因?yàn)镚ET請求的參數(shù)會包含在URL里面。

          使用 urlencode模塊 將字典序列化為GET請求參數(shù):

          import requests

          from urllib.parse import urlencode

          __author__='Evan'

          # 請求參數(shù)

          params={

          'name': 'Evan',

          'age': '24'

          }

          r=requests.get(url='http://httpbin.org/get?' + urlencode(params))

          print(r.text)

          打印結(jié)果:

          {

          "args": {

          "age": "24",

          "name": "Evan"

          },

          "headers": {

          "Accept": "*/*",

          "Accept-Encoding": "gzip, deflate",

          "Host": "httpbin.org",

          "User-Agent": "python-requests/2.22.0"

          },

          "origin": "12.192.229.251, 12.192.229.251",

          "url": "https://httpbin.org/get?name=Evan&age=24"

          }

          可以看到結(jié)果和使用params參數(shù)的GET請求是一樣的。

          2.2 POST請求

          POST請求大多在表單提交時(shí)發(fā)起。比如一個登陸表單,輸入用戶名和密碼后,點(diǎn)擊“登陸”按鈕,這通常會發(fā)起一個POST請求,其數(shù)據(jù)通常以表單的形式傳輸,表單數(shù)據(jù)會放在請求體中,而不會體現(xiàn)在URL中,所以提交的數(shù)據(jù)是保密的,不會泄露敏感信息,并且 POST請求提交的數(shù)據(jù)大小沒有限制。

          以實(shí)驗(yàn)網(wǎng)址為例(http://httpbin.org/post)

          基本請求:

          import requests

          __author__='Evan'

          # 請求參數(shù)

          data={

          'name': 'Evan',

          'age': '24'

          }

          r=requests.post(url='http://httpbin.org/post', data=data) # 使用POST請求訪問

          print(r.text)

          打印結(jié)果:

          {

          "args": {},

          "data": "",

          "files": {},

          "form": {

          "age": "24",

          "name": "Evan"

          },

          "headers": {

          "Accept": "*/*",

          "Accept-Encoding": "gzip, deflate",

          "Content-Length": "16",

          "Content-Type": "application/x-www-form-urlencoded",

          "Host": "httpbin.org",

          "User-Agent": "python-requests/2.22.0"

          },

          "json": null,

          "origin": "12.192.229.251, 12.192.229.251",

          "url": "https://httpbin.org/post"

          }

          可以發(fā)現(xiàn),其中form部分就是我們提交的數(shù)據(jù),這就證明POST請求成功發(fā)送了。

          requests還可以模擬提交一些數(shù)據(jù),比如上傳文件,要怎么添加呢?

          使用files參數(shù)構(gòu)造帶上傳文件的POST請求:

          import requests

          __author__='Evan'

          files={'file': open('haimianbaobao.ico', 'rb')} # 文件路徑

          r=requests.post(url='http://httpbin.org/post', files=files) # 帶上傳文件的POST請求

          print(r.text)

          打印結(jié)果:

          {

          "args": {},

          "data": "",

          "files": {

          "file": "data:application/octet-stream;base64,R0lGODlhkQCCAHAAACH5BABBAAAALAAAAA...="

          },

          "form": {},

          "headers": {

          "Accept": "*/*",

          "Accept-Encoding": "gzip, deflate",

          "Content-Length": "8732",

          "Content-Type": "multipart/form-data; boundary=c15f3180298f305a48359831993ed6b8",

          "Host": "httpbin.org",

          "User-Agent": "python-requests/2.22.0"

          },

          "json": null,

          "origin": "12.192.229.251, 12.192.229.251",

          "url": "https://httpbin.org/post"

          }

          以上省略部分內(nèi)容,可以發(fā)現(xiàn),里面包含files這個字段,而form字段是空的,這證明文件上傳部分會單獨(dú)有一個files字段來標(biāo)識。

          3. 高級用法

          現(xiàn)在大部分網(wǎng)站都有反爬機(jī)制,所以在請求網(wǎng)頁的時(shí)候一般都要添加請求頭才可以得到響應(yīng),某些網(wǎng)站限制登陸時(shí)還要設(shè)置cookies等,下面介紹一些常用的高級用法。(POST請求和GET請求同理,這里以GET請求為例)

          3.1 添加請求頭

          請求頭,用來說明服務(wù)器要使用的附加信息,比較重要的信息有Cookie、Referer、User-Agent等

          下面簡要說明一些常用的請求頭信息:

          • Accept- 請求報(bào)頭域,用于指定客戶端可接受哪些類型的信息。
          • Accept-Language- 指定客戶端可接受的語言類型
          • Accept-Encoding- 指定客戶端可接受的內(nèi)容編碼
          • Host- 用于指定請求資源的主機(jī)IP和端口號,其內(nèi)容為請求URL的原始服務(wù)器或網(wǎng)關(guān)的位置
          • Cookie- 也常用復(fù)數(shù)形式Cookies,它的主要功能是維持當(dāng)前訪問會話,服務(wù)器會用會話保存登陸狀態(tài)信息
          • Referer- 此內(nèi)容用來標(biāo)識這個請求是從哪個頁面發(fā)過來的,服務(wù)器可以拿這一信息做相應(yīng)的處理,如做來源統(tǒng)計(jì),放盜鏈處理等
          • User-Agent- 簡稱UA,它是一個特殊的字符串頭,可以使服務(wù)器識別客戶使用的操作系統(tǒng)及版本、瀏覽器及版本等信息。在做爬蟲時(shí)加上此信息,可以偽裝為瀏覽器,如果不加,很可能會被識別出為爬蟲
          • Content-Type- 也叫互聯(lián)網(wǎng)媒體類型(Internet Media Type)或者M(jìn)IME類型,它用來表示具體請求中的媒體類型信息。例如,text/html代表HTML格式,image/gif代表GIF圖片,application/json代表JSON類型等

          看到這相信你已經(jīng)了解請求頭中大部分參數(shù)的含義了,現(xiàn)在開始用程序?qū)崿F(xiàn)這些功能

          使用headers參數(shù)添加”User-Agent“:

          import requests

          __author__='Evan'

          # 請求頭參數(shù)

          headers={

          "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '

          'Chrome/78.0.3904.108 Safari/537.36'

          }

          r=requests.get(url='http://httpbin.org/get', headers=headers) # 帶請求頭的GET請求

          print(r.text)

          打印結(jié)果:

          {

          "args": {},

          "headers": {

          "Accept": "*/*",

          "Accept-Encoding": "gzip, deflate",

          "Host": "httpbin.org",

          "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"

          },

          "origin": "12.192.229.251, 12.192.229.251",

          "url": "https://httpbin.org/get"

          }

          可以看到,“User-Agent”已經(jīng)被添加上去了,所以添加請求頭很簡單,只要添加headers參數(shù)即可,headers是一個字典類型,根據(jù)需求填入相應(yīng)的請求頭信息就可以輕松的提交各種請求方式了。

          3.2 會話維持

          說到會話維持,第一想到的就是使用cookies,網(wǎng)頁為什么能保持會話,在登陸后不用重新登陸,就是因?yàn)閏ookies保持會話了,所以我們想要會話維持就要在請求頭中添加對應(yīng)的cookies,但是問題來了,如果每次在請求的時(shí)候都去添加cookies,這未免也太麻煩了吧,所以requests有一個新的利器-Session對象,利用它,我們可以方便地維護(hù)一個會話,而且不用擔(dān)心cookies的問題,它會幫我們自動處理好。

          示例如下:

          沒有使用Session之前:

          import requests

          __author__='Evan'

          # 第一次訪問,并設(shè)置cookies

          r1=requests.get(url='http://httpbin.org/cookies/set/number/123456789')

          print('r1: {}'.format(r1.text))

          # 第二次訪問

          r2=requests.get(url='http://httpbin.org/cookies')

          print('r2: {}'.format(r2.text))

          打印結(jié)果:

          r1: {

          "cookies": {

          "number": "123456789"

          }

          }

          r2: {

          "cookies": {}

          }

          這里我們請求了一個測試網(wǎng)址(http://httpbin.org/cookies/set/number/123456789)

          請求這個網(wǎng)址時(shí),可以設(shè)置一個cookie,名稱叫做number,內(nèi)容是123456789,

          隨后又請求了(http://httpbin.org/cookies),此網(wǎng)址可以獲取當(dāng)前的Cookies,但是看打印結(jié)果cookies為空,所以使用2次requests是相當(dāng)于打開兩個瀏覽器,這兩次requests的內(nèi)容是不共享的。

          接下來看使用Session的例子:

          import requests

          __author__='Evan'

          # 實(shí)例化Session對象

          s=requests.Session()

          # 第一次訪問,并設(shè)置cookies

          r1=s.get(url='http://httpbin.org/cookies/set/number/123456789')

          print('r1: {}'.format(r1.text))

          # 第二次訪問

          r2=s.get(url='http://httpbin.org/cookies')

          print('r2: {}'.format(r2.text))

          打印結(jié)果:

          r1: {

          "cookies": {

          "number": "123456789"

          }

          }

          r2: {

          "cookies": {

          "number": "123456789"

          }

          }

          成功獲??!所以需要登陸某些網(wǎng)站傳遞登陸信息時(shí)就使用Session對象來保持同一個會話,這樣就免去了每次要設(shè)置cookies的煩瑣了。

          3.3 代理設(shè)置

          對于某些網(wǎng)站,在測試的時(shí)候請求幾次能正常獲取內(nèi)容,但是一旦開始大規(guī)模爬取,網(wǎng)站可能會彈出驗(yàn)證碼,或者跳轉(zhuǎn)到登陸認(rèn)證頁面,更甚至可能會直接封禁客戶端的IP,導(dǎo)致一定時(shí)間段內(nèi)無法訪問,那么,為了防止這種情況發(fā)生,我們需要設(shè)置代理來解決這個問題。

          使用proxies參數(shù)設(shè)置代理:

          import requests

          __author__='Evan'

          # 使用普通格式

          proxies={"http": "http://10.10.1.10:3128", "https": "http://10.10.1.10:1080"}

          # 使用HTTP Basic Auth格式

          proxies={"http": "http://user:password@10.10.1.10:3128"}

          # 使用SOCKS協(xié)議(需要安裝 'requests[socks]' 模塊)

          proxies={"http": "socks5://user:password@host:port", "https": "socks5://user:password@host:port"}

          requests.get('http://httpbin.org/get', proxies=proxies) # 使用代理的GET請求

          當(dāng)然,直接運(yùn)行這個實(shí)例可能不行,因?yàn)檫@些代理IP可能是無效的,這里只講解proxies的使用格式和方法,具體大家可以去代理IP網(wǎng)站下載免費(fèi)的代理或者付費(fèi)的代理試驗(yàn)。

          3.4 超時(shí)設(shè)置

          在本機(jī)網(wǎng)絡(luò)狀況不好或者服務(wù)器網(wǎng)絡(luò)響應(yīng)太慢時(shí),我們可能會等待很久的時(shí)間才能收到響應(yīng),這個時(shí)候就可以使用timeout參數(shù),這個時(shí)間的計(jì)算是從發(fā)出請求到服務(wù)器響應(yīng)的時(shí)間。

          示例如下:

          import requests

          __author__='Evan'

          r=requests.get(url='http://httpbin.org/get', timeout=1)

          print(r.text)

          打印結(jié)果:

          Traceback (most recent call last):

          File "C:/Evan/my_program/shining_star/trunk/unit_testing/test1.py", line 20, in <module>

          r=requests.get(url='http://httpbin.org/get', timeout=1)

          File "C:\pycharm_user\venv\lib\site-packages\requests\api.py", line 75, in get

          return request('get', url, params=params, **kwargs)

          File "C:\pycharm_user\venv\lib\site-packages\requests\api.py", line 60, in request

          return session.request(method=method, url=url, **kwargs)

          File "C:\pycharm_user\venv\lib\site-packages\requests\sessions.py", line 533, in request

          resp=self.send(prep, **send_kwargs)

          File "C:\pycharm_user\venv\lib\site-packages\requests\sessions.py", line 646, in send

          r=adapter.send(request, **kwargs)

          File "C:\pycharm_user\venv\lib\site-packages\requests\adapters.py", line 529, in send

          raise ReadTimeout(e, request=request)

          requests.exceptions.ReadTimeout: HTTPConnectionPool(host='httpbin.org', port=80): Read timed out. (read timeout=1)

          通過這樣的方式,我們可以將超時(shí)時(shí)間設(shè)置為1秒,如果在1秒內(nèi)沒有收到響應(yīng),那就拋出異常,還可以加上try-except進(jìn)行異常處理,防止等待過長而浪費(fèi)時(shí)間,我們還可以直接設(shè)置為None,或者不設(shè)置直接留空,因?yàn)槟J(rèn)也是None,這樣的話表示永久等待下去,直到收到服務(wù)器響應(yīng)結(jié)果。

          3.5 身份認(rèn)證

          在訪問某些網(wǎng)站時(shí),我們可能會遇到如下圖所示,彈出一個輸入框提示身份驗(yàn)證,此時(shí)可以使用auth參數(shù)添加用戶名和密碼進(jìn)行認(rèn)證。

          示例如下:

          import requests

          __author__='Evan'

          r=requests.get('http://localhost:5000', auth=('username', 'password'))

          print(r.text)

          auth參數(shù)是一個元組,該元組第一個參數(shù)為用戶名,第二個參數(shù)為密碼,提供這個參數(shù)后requests會默認(rèn)使用HTTPBasicAuth這個類來認(rèn)證,這樣就可以解除認(rèn)證,繼續(xù)訪問后續(xù)頁面了。

          4. 響應(yīng)

          當(dāng)我們使用requests請求網(wǎng)頁時(shí),會返回一個response,我們就是要解析這個response,才能拿到我們想要的信息,所以接下來先介紹響應(yīng)是由哪些信息組成的,然后再介紹怎么用requests獲取這些信息。

          4.1 響應(yīng)的組成

          響應(yīng)是指服務(wù)器返回客戶端的結(jié)果,可以分為三個部分:(響應(yīng)狀態(tài)碼、響應(yīng)頭、響應(yīng)體)

          4.1.1 響應(yīng)狀態(tài)碼

          響應(yīng)狀態(tài)碼表示服務(wù)器的響應(yīng)狀態(tài),如200代表服務(wù)器正常響應(yīng),404代表頁面未找到,500代表服務(wù)器內(nèi)部發(fā)生錯誤。在爬蟲中,我們可以根據(jù)狀態(tài)碼來判斷服務(wù)器的響應(yīng)狀態(tài)然后再進(jìn)行下一步的處理。

          下面列出一些常見的狀態(tài)碼供參考:

          200- 【成功】服務(wù)器已經(jīng)成功處理了請求

          301- 【永久移動】請求的網(wǎng)頁已永久移動到新位置,即永久重定向

          302- 【臨時(shí)移動】請求的網(wǎng)頁暫時(shí)跳轉(zhuǎn)到其他頁面,即暫時(shí)重定向

          400- 【錯誤請求】服務(wù)器無法解析該請求

          401- 【未授權(quán)】請求沒有進(jìn)行身份驗(yàn)證或驗(yàn)證未通過

          403- 【禁止訪問】服務(wù)器拒絕此請求

          404- 【未找到】服務(wù)器找不到請求的網(wǎng)頁

          408- 【請求超時(shí)】服務(wù)器請求超時(shí)

          410- 【已刪除】請求的資源已永久刪除

          500- 【服務(wù)器內(nèi)部錯誤】服務(wù)器遇到錯誤,無法完成請求

          502- 【錯誤網(wǎng)關(guān)】服務(wù)器作為網(wǎng)關(guān)或代理,從上游服務(wù)器收到無效響應(yīng)

          503- 【服務(wù)不可用】服務(wù)器當(dāng)前無法使用

          504- 【網(wǎng)關(guān)超時(shí)】服務(wù)器作為網(wǎng)關(guān)或代理,但是沒有及時(shí)從上游服務(wù)器收到請求

          505- 【HTTP版本不支持】服務(wù)器不支持請求中所有的HTTP協(xié)議版本

          4.1.2 響應(yīng)頭

          響應(yīng)頭包含了服務(wù)器對請求的應(yīng)答信息,如Content-Type、Server、Set-Cookie等。

          下面簡要說明一些常用的響應(yīng)頭信息:

          • Date- 標(biāo)識響應(yīng)產(chǎn)生的時(shí)間
          • Last-Modified- 指定資源的最后修改時(shí)間
          • Content-Encoding- 指定響應(yīng)內(nèi)容的編碼
          • Server- 包含服務(wù)器的信息,比如名稱、版本號等
          • Content-Type- 文檔類型,指定返回的數(shù)據(jù)類型是什么,如text/html代表返回HTML文檔,application/x-javascript則代表返回JavaScript文件,image/jpeg則代表返回圖片
          • Set-Cookie- 設(shè)置Cookies,響應(yīng)頭中的Set-Cookie告訴瀏覽器需要將此內(nèi)容放在Cookies中,下次請求攜帶Cookies請求
          • Expires- 指定響應(yīng)的過期時(shí)間,可以使代理服務(wù)器或?yàn)g覽器將加載的內(nèi)容更新到緩存中,如果再次訪問時(shí),就可以直接從換從中加載,降低服務(wù)器負(fù)載,縮短加載時(shí)間

          4.1.3 響應(yīng)體

          響應(yīng)體是最重要的內(nèi)容,響應(yīng)的正文數(shù)據(jù)都是在響應(yīng)體中,比如請求網(wǎng)頁時(shí),它的響應(yīng)體就是網(wǎng)頁的HTML代碼,請求一張圖片時(shí),它的響應(yīng)體就是圖片的二進(jìn)制數(shù)據(jù),在做爬蟲時(shí),我們主要通過響應(yīng)體得到網(wǎng)頁的源代碼,JSON數(shù)據(jù)等,然后從中做相應(yīng)內(nèi)容的提取。

          當(dāng)然,在我們不使用爬蟲時(shí)也可以直接看到響應(yīng)體(也就是網(wǎng)頁源代碼),所以在開始寫爬蟲前應(yīng)先看一遍網(wǎng)頁源代碼,了解自己要抓取哪些信息,這些信息放在哪個位置等等。

          下面介紹一些查看網(wǎng)頁源代碼的方法:

          1. 打開瀏覽器開發(fā)者工具(按F12),然后在瀏覽器開發(fā)者工具中點(diǎn)擊Elements,就可以看到網(wǎng)頁的源代碼了,也就是響應(yīng)體的內(nèi)容,它是解析的目標(biāo)
          2. 在網(wǎng)頁上按鼠標(biāo)右鍵,然后點(diǎn)擊查看網(wǎng)頁源代碼,這個時(shí)候會彈出一個新的窗口,里面的內(nèi)容就是當(dāng)前頁面的源代碼了

          4.2 響應(yīng)的獲取

          在發(fā)送請求后,得到的自然就是響應(yīng)了,上面我們已經(jīng)介紹了響應(yīng)是由哪些信息組成的,現(xiàn)在介紹怎么用requests去獲取這些信息。

          示例如下:

          # -*- coding:utf-8 -*-

          import requests

          __author__='Evan'

          r=requests.get(url='http://httpbin.org/get') # 使用GET請求訪問

          # 獲取網(wǎng)頁信息

          print('請求的URL: {}'.format(r.url)) # 獲取當(dāng)前URL,返回一個字符串

          print('響應(yīng)狀態(tài)碼: {}'.format(r.status_code)) # 獲取響應(yīng)狀態(tài)碼,返回一個整形

          print('響應(yīng)頭部信息: {}'.format(r.headers)) # 獲取響應(yīng)頭部信息,返回一個字典

          print('響應(yīng)Cookies: {}'.format(r.cookies)) # 獲取響應(yīng)Cookies,返回一個字典

          print('訪問的歷史記錄: {}'.format(r.history)) # 獲取訪問的歷史記錄,可以查看是否重定向,返回一個列表

          print('網(wǎng)頁源代碼: {}'.format(r.text)) # 獲取網(wǎng)頁源代碼,返回一個字符串

          print('網(wǎng)頁二進(jìn)制數(shù)據(jù): {}'.format(r.content)) # 獲取網(wǎng)頁內(nèi)容的二進(jìn)制格式,返回一個二進(jìn)制數(shù)據(jù)

          print('JSON數(shù)據(jù): {}'.format(r.json)) # 如果響應(yīng)信息是JSON數(shù)據(jù)則調(diào)用此方法,返回一個字典

          打印結(jié)果:

          請求的URL: http://httpbin.org/get

          響應(yīng)狀態(tài)碼: 200

          響應(yīng)頭部信息: {'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json', 'Date': 'Sat, 21 Dec 2019 13:50:15 GMT', 'Referrer-Policy': 'no-referrer-when-downgrade', 'Server': 'nginx', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'Content-Length': '181', 'Connection': 'keep-alive'}

          響應(yīng)Cookies: <RequestsCookieJar[]>

          訪問的歷史記錄: []

          網(wǎng)頁源代碼: {

          "args": {},

          "headers": {

          "Accept": "*/*",

          "Accept-Encoding": "gzip, deflate",

          "Host": "httpbin.org",

          "User-Agent": "python-requests/2.21.0"

          },

          "origin": "119.123.1.99, 119.123.1.99",

          "url": "https://httpbin.org/get"

          }

          網(wǎng)頁二進(jìn)制數(shù)據(jù): b'{\n "args": {}, \n "headers": {\n "Accept": "*/*", \n "Accept-Encoding": "gzip, deflate", \n "Host": "httpbin.org", \n "User-Agent": "python-requests/2.21.0"\n }, \n "origin": "119.123.1.99, 119.123.1.99", \n "url": "https://httpbin.org/get"\n}\n'

          JSON數(shù)據(jù): <bound method Response.json of <Response [200]>>




          原文鏈接:https://blog.csdn.net/weixin_43750377/article/details/103603834

          接口測試是我們在測試工作中經(jīng)常見到的,我們工作中常用到的接口工具有jmeter,postman,soupUI等工具,那么在通過代碼做接口測試呢?或者通過代碼的方式做接口自動化呢?

          requests

          requests屬于python的第三方庫,通常用來發(fā)送http和https的請求,既然能向http和https發(fā)送請求,那么就能來做接口測試。

          安裝

          pip install requests

          requests使用方法

          了解requests是如何安裝的了,也知道了requests的安裝方法了,那么接下來就開始進(jìn)行實(shí)際操作了。

          get請求

          都知道https請求方式有很多種,如何通過requests來發(fā)送get請求呢?這里安靜通過模仿百度搜索內(nèi)容進(jìn)行發(fā)送請求。

          其中g(shù)et方法中存在3個參數(shù):url和params,其中url表示我們請求的地址,params表示請求參數(shù)(get方式的請求存在url地址中),headers表示請求頭信息內(nèi)容。

          import requests

          url='http://www.baidu.com/s'

          headers={

          "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"

          }

          params={

          "wd": "測試-安靜"

          }

          r=requests.get(url=url, params=params,headers=headers)

          print(r)

          print(r.url)

          if '測試-安靜' in r.content.decode('utf-8'):

          print('請求成功!')

          通過執(zhí)行結(jié)果是成功的。

          其中requests的返回內(nèi)容還有很多種,上面介紹的url,和content只是其中兩種。

          r.status_code #響應(yīng)狀態(tài)碼

          r.content #字節(jié)方式的響應(yīng)體,會自動為你解碼 gzip 和 deflate 壓縮

          r.headers # 請求頭信息

          r.json() # Requests中SON

          r.url # 獲取url

          r.encoding # 編碼格式

          r.cookies # 獲取cookie

          r.text #字符串方式的響應(yīng)體

          post請求

          post請求和get請求類似。post的參數(shù)主要有url、data(json)、headers。

          url:請求接口地址

          data:post請求參數(shù)類型

          json:post請求參數(shù)類型

          headers:請求頭信息

          這里安靜通過請求查詢天氣的接口來模擬post請求。

          data請求

          import requests

          # 登錄請求地址

          url='http://apis.juhe.cn/simpleWeather/query'

          # 請求頭

          headers={

          "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36",

          }

          # body數(shù)據(jù)

          data={

          'city': "上海", # 賬號

          "key": "331eab8f3481f37868378fcdc76cb7cd", # 密碼

          }

          # 發(fā)送請求

          r=requests.post(url, headers=headers, data=data)

          print(r.text)

          通過執(zhí)行發(fā)現(xiàn),已經(jīng)請求成功,并返回了響應(yīng)結(jié)果。

          json請求

          import requests

          url="http://httpbin.org/post"

          # 添加json數(shù)據(jù)

          json={

          "username":"AnJing",

          "password":"123456"

          }

          # 通過json方式添加數(shù)據(jù)

          r=requests.post(url,json=json)

          print(r.text)

          通過執(zhí)行結(jié)果可以看出我們請求的接口類型。

          請求HTTPS

          現(xiàn)在的網(wǎng)站都是HTTPS的了,所謂的HTTPS就是加密過的網(wǎng)站,在原有的HTTP的基礎(chǔ)上加上了SSL。HTTPS的請求基本上都是屬于SSL加密的,那么對于這種HTTPS的請求,如果我們通過requests的請求進(jìn)行訪問,會報(bào)一個requests.exceptions.SSLError的錯誤。

          對于這種問題,我們可以通過加入?yún)?shù)“verify=False”,requests請求時(shí),verify默認(rèn)為True,當(dāng)設(shè)置False時(shí),requests請求會進(jìn)行忽略SSL,從而進(jìn)行訪問HTTPS請求。

          import requests

          url="https://www.51testing.org/htm/brandpc/PZ.html"

          r=requests.get(url, verify=False)

          print(r.text)

          通過加入?yún)?shù)后,在去執(zhí)行的時(shí)候就不會報(bào)SSLerror的錯誤了。

          session

          關(guān)于session相信大家都不陌生,他和cookies一樣使用來表示用戶的登錄的一種信息,cookies通常保存在客戶端的,session保存在服務(wù)端上。其中session可以相當(dāng)于一個虛擬的瀏覽器,用來保持登錄的狀態(tài)。requests中有單獨(dú)方法 requests.session() 的方法用來保存登錄狀態(tài)。當(dāng)然requests中有關(guān)于對cookies的登錄,我們可以通過cookies加入到請求中,然后用來模擬登錄場景。然后再去請求其他頁面,可以看看到底我們的會話有沒有保存成功。這里通過模擬博客園的場景進(jìn)行來操作cookies登錄。

          首先通過Fiddler進(jìn)行抓取登錄前和登錄后的cookies值來判斷博客園的登錄到底是通過什么進(jìn)行來登錄的。

          登錄前的cookies

          登錄后的cookies

          通過使用fiddler抓取,我們已經(jīng)找到了登錄的cookies內(nèi)容,然后通過requests中的cookies進(jìn)行來添加。具體代碼:

          # coding:utf-8

          import requests

          import urllib3

          urllib3.disable_warnings()

          s=requests.session()

          s.verify=False

          url='https://passport.cnblogs.com/user/signin'

          headers={

          "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"

          }

          r=s.get(url,headers=headers)

          cooks={

          ".Cnblogs.AspNetCore.Cookies":"這里寫入抓取到的cookies值",

          ".CNBlogsCookie":"抓取到的cookies值"

          }

          c=requests.cookies.RequestsCookieJar()

          # 登陸有效的cookies

          c.set(".CNBlogsCookie", cooks[".CNBlogsCookie"])

          c.set(".Cnblogs.AspNetCore.Cookies", cooks[".Cnblogs.AspNetCore.Cookies"])

          # 將cookies值全部添加到session中

          s.cookies.update(c)

          # 訪問后臺地址,確定是否登錄成功

          url1="https://i.cnblogs.com/posts/edit"

          r1=s.get(url1)

          result=r1.content.decode('utf-8')

          if "博客后臺 - 博客園" in result:

          print("登錄成功!")

          通過執(zhí)行發(fā)現(xiàn),我們已經(jīng)完成了登錄后,并通過session的形式進(jìn)行訪問本網(wǎng)站的其他地址一樣是保持著登錄的狀態(tài)。

          重定向

          接口測試中也經(jīng)常遇到重定向的問題,什么是重定向?就是通過各種方法將各種網(wǎng)絡(luò)請求重新定個方向轉(zhuǎn)到其它位置。在requests中也有這對重定向的操作allow_redirects其中參數(shù)默認(rèn)是True就是允許重定向,當(dāng)我們請求的時(shí)候,將這個參數(shù)設(shè)置成False,就能不讓其進(jìn)行重定向。

          # coding:utf-8

          import requests

          url='http://github.com'

          # 重定向?yàn)镕alse

          r=requests.get(url, allow_redirects=False)

          print('拒絕重定向請求的狀態(tài)碼:%s'%(r.status_code))

          print('拒絕重定向請求地址:%s'%(r.url))

          # 重定向?yàn)門rue(默認(rèn)為True)

          r2=requests.get(url)

          print('允許重定向請求的狀態(tài)碼:%s'%(r2.status_code))

          print('允許重定向請求地址:%s'%(r2.url))

          通過執(zhí)行發(fā)現(xiàn),我們的參數(shù)已經(jīng)設(shè)置成功了。在拒絕重定向的時(shí)候請求的狀態(tài)為301,允許重定向的時(shí)候?yàn)?00。

          總結(jié)

          安靜簡單地介紹了requests中的一些常用方法,這些方法可以幫助我們通過python+requests進(jìn)行編寫關(guān)于接口測試的方便的代碼。等熟練使用requests后可以進(jìn)行嘗試編寫自動化測試代碼進(jìn)行輔助日常測試工作。

          請關(guān)注+私信回復(fù):“頭條”就可以免費(fèi)拿到軟件測試學(xué)習(xí)資料和面試題庫,快速讓自己變強(qiáng)!

          蟲的基本框架是獲取HTML頁面信息,解析頁面信息,保存結(jié)果,requests模塊是用于第一步獲取HTML頁面信息; requests庫用于爬取HTML頁面,提交網(wǎng)絡(luò)請求,基于urllib,但比urllib更方便;

          (一)、發(fā)送請求

          對應(yīng)http的不同請求類型,requests庫有不同的方法:

          1.requests.get():

          獲取HTML網(wǎng)頁的主要方法,對應(yīng)于HTTP的GET

          2.requests.post():

          向HTML網(wǎng)頁提交POST請求的方法,對應(yīng)于HTTP的POST

          3.requests.head():

          獲取HTML網(wǎng)頁頭信息的方法,對應(yīng)于HTTP的HEAD

          4.requests.put():

          向HTML網(wǎng)頁提交PUT請求,對應(yīng)于HTTP的PUT

          5.requests.patch():

          向HTML網(wǎng)頁提交局部修改請求,對應(yīng)于HTTP的PATCH

          6.requests.delete():

          向HTML頁面提交刪除請求,對應(yīng)于HTTP的DELETE

          (二)、響應(yīng)內(nèi)容

          當(dāng)我們用上述方法向HTML頁面發(fā)送請求后,會獲得一個Response對象;

          例如 r=requests.get('https://www.python.org/')

          r 就是一個Response對象,我們可以從這個對象中獲取我們想要的信息;

          Response對象的一些屬性有:

          1. r.status_code: HTTP請求的返回狀態(tài),200表示連接成功,404表示失敗
          2. r.text: URL所對應(yīng)的頁面內(nèi)容(字符串形式)
          3. r.content: 頁面內(nèi)容的二進(jìn)制形式
          4. r.encoding: 從HTTP header 中推測的響應(yīng)內(nèi)容的編碼形式
          5. r.apparent_encoding: 從內(nèi)容分析出的響應(yīng)內(nèi)容的編碼形式
          6. r.headers: 以字典形式顯示的服務(wù)器頭信息

          (三)、實(shí)例


          主站蜘蛛池模板: 国产精品一区二区综合| 国产日韩视频一区| 精品人妻一区二区三区四区在线| 午夜福利无码一区二区| 国产日韩视频一区| 熟妇人妻一区二区三区四区| 精彩视频一区二区三区| 在线精品视频一区二区| 精品无人区一区二区三区在线| 超清无码一区二区三区| 国产一区二区三精品久久久无广告| 人妻无码久久一区二区三区免费 | 中文字幕无码一区二区三区本日| 精品无码一区二区三区亚洲桃色| 中文字幕日本一区| 色欲AV无码一区二区三区| 五十路熟女人妻一区二区| 国产精品福利一区二区久久| 国产激情视频一区二区三区| 亚洲视频免费一区| 国产一区二区三区小向美奈子| 亚洲第一区精品日韩在线播放| 香蕉免费看一区二区三区| 合区精品久久久中文字幕一区| 国产精品va一区二区三区| 国产成人久久一区二区不卡三区 | 日韩精品一区二区三区影院| 国产精品熟女视频一区二区| 无码喷水一区二区浪潮AV| 日韩一区二区三区电影在线观看| 久久青青草原一区二区| 日本无码一区二区三区白峰美| 亚洲A∨精品一区二区三区下载| 一区二区三区高清| 一区二区三区影院| 亚洲色大成网站www永久一区| 无码人妻一区二区三区兔费| 亚洲日韩中文字幕无码一区| 国产精品无码亚洲一区二区三区| 国产成人无码精品一区不卡| 视频在线一区二区三区|