關於Python ,requests的小技巧


關於 Python Requests ,在使用中,總結了一些小技巧把,分享下。


1:保持請求之間的Cookies,我們可以這樣做。

import requests self.session = requests.Session() self.session.get(login_url) # 可以保持登錄態
  • 1
  • 2
  • 3

2:請求時,會加上headers,一般我們會寫成這樣

self.session.get(url, params, headers=headers)
  • 1

唯一不便的是之后的代碼每次都需要這么寫,代碼顯得臃腫,所以我們可以這樣:

#在構造函數中,這樣設置是全局的。 # 設置請求頭 self.s = requests.Session() self.s.headers = {'balabala'} # 移除服務器驗證 self.s.verify = False # 設置代理 self.s.proxies={'aa'} # 如果后續headers有改變,再次賦值就可以了。 self.s.get(url, params, headers=new_headers)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

3:默認requests請求失敗后不會重試,但是我們跑case時難免遇到一些網絡,服務重啟,外部原因導致case失敗,我們可以在Session實例上附加HTTPAdapaters 參數,增加失敗重試次數。

request_retry = requests.adapatrs.HTTPAdapaters(max_retries=3) self.session.mount('https://',request_retry) self.session.mount('http://',request_retry)
  • 1
  • 2
  • 3
  • 4

這樣,之后的請求,若失敗,重試3次。


4:重定向 
網絡請求中可能會遇到重定向,我們需要一次處理一個請求,可以把重定向禁止。

self.session.post(url,data,allow_redirects=False)
  • 1

5: post請求提交json格式數據時(請求頭為:{“Content-Type”: “application/json”}),一般先要把python對象轉換成json對象。可能很多時候是這樣寫:

self.session.post(url, data=json.dumps(data))。
  • 1

其實post有一個默認參數json,可以直接簡寫成:

 self.session.post(url, json=data)
  • 1

6:寫接口請求,debug時,會需要看下代碼請求的詳細信息,當然我們可以使用fiddler來查看,其實我們自己也可以在代碼這樣獲取debug信息*

import requests import logging import httplib as http_client http_client.HTTPConnection.debuglevel = 1 logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True requests.get('https://www.baidu.com') #更好的方法是自己封裝一個裝飾器,就可以為任意請求函數添加一個debug功能。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

7:使用grequests實現異步請求。

pip install grequests

import grequests urls = [ 'http://www.url1.com', 'http://www.url2.com', 'http://www.url3.com', 'http://www.url4.com', 'http://www.url5.com', 'http://www.url6.com', ] resp = (grequests.get(u) for u in urls) grequests.map(resp) # [<Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>, <Response [200]>] 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

8:發送自定義cookies 
我們使用Session實例來保持請求之間的cookies,但是有些特殊情況,需要使用自定義的cookies 
我們可以這樣

# 自定義cookies cookie = {'guid':'5BF0FAB4-A7CF-463E-8C17-C1576fc7a9a8','uuid':'3ff5f4091f35a467'} session.post('http://wikipedia.org', cookies=cookie) 
  • 1
  • 2
  • 3
  • 4
  • 5

9:需求確定前后端並行設計時,這時測試並沒有辦法調用接口,如何做接口測試呢?我們可以使用mock或者是httpretty

import requests import httpretty # 模擬返還的狀態碼 @httpretty.activate def test_beta1_access(): httpretty.register_uri(httpretty.GET, "http://beta.com/", body="here is the mocked body", status=201) response = requests.get('http://beta.com') expect(response.status_code).to.equal(201) # 模擬返還response的body @httpretty.activate def test_some_api(): httpretty.register_uri(httpretty.GET, "http://beta.com/", body='{"success": false}', content_type='text/json') response = requests.get('http://beta.com/') expect(response.json()).to.equal({'success': False})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

詳細使用可以查看API_DOC


10:統計一個API請求花費的時間,我們可以使用如下方法

self.session.get(url).elapsed 
  • 1
  • 2

11:設置請求超時


self.session.get(url, timeout=15) # timeout 僅對連接過程有效,與響應體的下載無關。 # timeout 並不是整個下載響應的時間限制,而是如果服務器在15 秒內沒有應答,將會引發一個異常(更精確地說,是在 timeout 秒內沒有從基礎套接字上接收到任何字節的數據時)
  • 1
  • 2
  • 3
  • 4
  • 5

關於Python ,requests的小技巧,就是這些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM