【python】requests庫


中文官方文檔:https://docs.python-requests.org/zh_CN/latest/user/advanced.html#proxies

requests是python實現的簡單易用的HTTP庫,屬於python的第3方庫。requests封裝了HTTP請求的所有方法,使用方便簡單,只需要根據不同的請求方式調用相對應的方法就可以完成發送網絡請求的整個過程。

requests庫中的get、post、put、head、delete等方法都是通過調用requests.request方法實現的。

1. get()方法

requests是通過調用get()方法來完成發送get請求的。get()方法源碼如下:

def get(self, url, params, **kwargs):
    r"""Sends a GET request.

    :param url: URL for the new :class:`Request` object.
    :param params: (optional) Dictionary, list of tuples or bytes to send
        in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response <Response>` object
    :rtype: requests.Response
    """

    kwargs.setdefault('allow_redirects', True)
    return self.request('GET', url, **kwargs)

params參數說明:

  • params需要傳入字典dict類型的接口數據,如果數據類型是json需要先轉成字典。

  • get請求中,通過params傳遞的參數會附加到url。如果使用data或json來發送接口參數,請求不會成功。(因為data或json參數不會附加到url)

注意:基於get請求的特點,請求參數也可以直接跟在URL之后。

2. post()方法

requests是通過調用post()方法來完成發送post請求的。源碼如下:

def post(self, url, data=None, json=None, **kwargs):
    r"""Sends a POST request. Returns :class:`Response` object.
    
    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, list of tuples, bytes, or file-like object to send in the body of the :class:`Request`.
    :param json: (optional) json to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :rtype: requests.Response
    """
    
    return self.request('POST', url, data=data, json=json, **kwargs)

何時使用data參數或json參數,需要根據實際的接口所支持的數據類型進行選擇:

1.data參數

  • 大多數post請求的接口默認支持參數類型Content-Type為application/x-www-form-urlencoded,這時請求的接口參數需要傳遞一個form表單,往往是通過構造一個字典來傳遞form表單的。

  • 所以當我們向服務器提交form表單時就可以使用data參數,它會接收一個字典類型的數據,存放到請求體中,然后發送給服務器。(參數需是字典類型)

2.json參數

  • 訪問的接口支持content_type為application/json格式的數據類型,就可以通過json來傳遞接口參數

  • json參數可以是字典也可以是json類型

3. Response對象

使用requests方法后,會返回一個response對象,其存儲了服務器響應的內容。常用的響應信息如下:

r.text #type:<class 'str'>,字符串方式的響應體,會自動根據響應頭部的r.encoding進行解碼
r.content #字節方式的響應體,中文顯示為字符,會自動為你解碼 gzip 和 deflate 壓縮
r.raw #返回原始響應體,也就是 urllib 的 response 對象,使用 r.raw.read() 讀取
r.json() #type:<class 'dict'>,Requests中內置的JSON解碼器,以json形式返回。前提返回的內容確保是json格式的,不然解析出錯會拋異常

r.encoding #如果響應header中不存在charset,則認為編碼為ISO‐8859‐1 
r.apparent_encoding    #從網頁內容中分析出的響應內容編碼方式(備選編碼方式)
#r.text返回中若有亂碼,可設置為下面兩種編碼:
r.encoding = 'utf-8' 
r.encoding = r.apparent_encoding

r.status_code #響應狀態碼
r.raise_for_status() #失敗請求(非200響應)拋出異常
r.reason #狀態原因

r.url #最終的url
r.headers #以字典對象存儲服務器響應頭,但是這個字典比較特殊,字典鍵不區分大小寫,若鍵不存在則返回None
r.request.headers #返回請求消息的報頭
r.cookies #返回cookies

4. 其他用法

1.上傳文件

import requests
 
url = 'http://127.0.0.1:5000/upload'
files = {'file': open('/home/lyb/sjzl.mpg', 'rb')}
# files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))}     #顯式的設置文件名

r = requests.post(url, files=files)
print(r.text)

2.代理訪問

采集時為避免被封IP,經常會使用代理。可通過給requests方法提供proxies參數來配置代理,如下:

import requests
 
proxies = {
  "http": "http://10.10.1.10:3128",
  "https": "http://10.10.1.10:1080",
}
requests.get("http://www.zhidaow.com", proxies=proxies, timeout=6)
# 通過timeout屬性設置超時時間,一旦超過這個時間還沒獲得響應內容,就會提示錯誤

# 如果代理需要賬戶和密碼,則需這樣:
proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}


免責聲明!

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



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