requests詳解 ---- 第3章節

1. requests的方法

requests模塊中的方法有get、post、put、delete、patch等,常用的是get和post方法。使用示例是:

requests.requets(method='get')
requests.requets(method='post')
2. requests的參數

get方法的參數有:url、headers、cookies、params、proxies等,示例:

requests.get(
    url='https://www.baidu.com',
    headers={},
    cookies={},
    params={'k1': 'v1', 'k2': 'v2'},  # https://www.thanlon.cn?k1=v1&k2=v2
    data={'user': 'thanlon', 'pwd': '123456'},
    json={'user': 'thanlon', 'pwd': '123456'},
    proxies={
        # 如果是http向123.206.74.1:80發送請求,由123.206.74.1:80來幫助我們向目標站點發請求
        # 如果是https就會找http://123.206.74.24:3000這個代理
        'http': '123.206.74.1:80',
        'https': 'http://123.206.74.24:3000',
        # 指定的地址使用指定的地址
        'http://www.thanlon.cn': 'http://123.206.74.24:3000'
        # 公司裏要隨機去動態使用代理 ip,可以使用random函數
    },
    files={
        # 'f1': open('log.txt', 'rb')
        # 自定義上傳的文件名
        # 'f1': ('test.txt', open('log.txt', 'rb'))
    },
    # 認證,下面有詳細介紹
    auth=None,
    # 連接超時。timeout=(5,1):返回超時,連接超時。
    # 如果請求的地址重定向了,默認瀏覽器重定向到其它地址拿到結果。但如果寫了False表示不重定向,拿到的是響應頭(重定向),沒有相應體。
    timeout=1,
    # 是否允許重定向
    allow_redirects=True,
    # 大文件下載,下面有詳細介紹
    stream=True,
    # verify = False:不用確認,直接進行下去
    cert='xxx.pem', verify=False
)

post方法的參數有:url、headers、cookies、data、json等,基本上和get方法的參數通用,示例:

requests.post(
    url='https://www.baidu.com',
    headers={},
    cookies={},
    # 傳請求體,放到請求頭中,不顯示在url中 GET /index http1.1\r\nhost:c1.com\r\n\r\nuser=thanlon&pwd=123456
    data={'user': 'thanlon', 'pwd': '123456'},
    json={'user': 'thanlon', 'pwd': '123456'},
    proxies={},
    files={
        # 'f1': open('log.txt', 'rb')
    },
    # 認證,下面有詳細介紹
    auth=None,
    # 連接超時。timeout=(5,1):返回超時,連接超時
    timeout=1,
    # 是否允許重定向
    allow_redirects=True,
    # 大文件下載,下面有詳細介紹
    stream=True,
    # verify = False:不用確認,直接進行下去
    cert='xxx.pem', verify=False,
)

代理的驗證:

# coding:utf-8
import requests
from requests.auth import HTTPProxyAuth

proxies = {
    'http': '123.206.74.1:80',
    'https': 'http://123.206.74.24:3000'
}
auth = HTTPProxyAuth('thanlon', 'kiku')  # 代理認證是需要的代理的用戶名和密碼,通過data傳入
ret = requests.get('http://www.thanlon.cn', proxies=proxies, auth=auth)
# 如果給目標站點的用戶和密碼使用data
# ret = requests.get('http://www.blueflags.cn', data={'thanlon', 'kiku'}, proxies=proxies, auth=auth)
print(ret.text)

認證auth:瀏覽器彈窗(路由器)內部是將用戶和密碼加密,放在請求頭中傳給後臺。瀏覽器做的:① 把用戶名和密碼拼接成字符串"用戶:密碼";② 對該字符串進行加密,base64(“用戶:密碼”),base64是可以反解的;③ 對字符串拼接,再構造一個字符串"Basic base64(‘用戶|密碼’)"; ④ 把該字符串放在請求頭中, Authorization:“basic base64(‘用戶|密碼’)”。

import requests
from requests.auth import HTTPBasicAuth, HTTPDigestAuth  # HTTPDigestAuth是數字認證,算法與基礎認證不一樣

result = requests.get('https://api.github.com/user', auth=HTTPBasicAuth('thanlon', 'xxx'))
print(result.text)
'''
{"message":"Bad credentials","documentation_url":"https://developer.github.com/v3"}
'''

安全機制弱,一般不用,不可以自己定義加 token,也不可以自己定義請求頭,這是定死的規則。

stream:大文件下載。使用 requests 可以下載大文件,比如視頻文件。如果有8G的視頻,發個請求8個G視頻全部放到內存,需要把視頻從內存寫到文件中。內存如果沒有8G,很可能宕機。如果使用 stream = True,是一點一點下載。

import requests

from contextlib import closing

with closing(requests.get('http://google.com/', stream=True)) as r:  # 一點一點下載
    # 處理響應
    pass
for i in r.iter_content():  # 一點一點取
    print(i)
3. requests的6種常見異常

requests.ConnectionError:網絡連接異常,如DNS查詢失敗,拒絕連接
requests.HTTPError:HTTP錯誤異常
requests.URLRequired:URL缺失異常
requests.TooManyRedirects:超過最大重定向次數,產生重定向異常
requests.ConnectTimeout:連接遠程服務器超時異常
requests.Timeout:請求url超時,產生超時異常

值得注意的是:Timeout異常是發出url請求獲取內容整個過程的超時異常,而ConnectTimeout異常僅指與遠程服務器連接產生的超時異常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章