requests库
一:requests優點原理
requests發送請求優點:
1.?無需手動為url添加查詢字符串
2.不需要對post請求進行表單編碼
3.keep-alive和HTTP連接池的功能是完全自動化的
4.帶持久Cookie的會話
5.瀏覽器式的ssl認證
6.自動內容解碼
7.基本、摘要式的身份認證
8.自動解壓
9.unicode相應體
10.https代理支持
11.文件分塊上傳
12.流下載
13.連接超時
14.分塊請求
15.支持。netrc
原理:
requests內部封裝urllib3
?
request上手:
1.發送請求:
request有簡單的api意味著所有http請求類型都是顯而易見。post、put、delete、head、options
例如:http://httpbin.org/post
?
2.傳遞url參數:
requests?允許視同params關鍵字參數,以一個字符串字典來提供參數
如:payload={'key1':"value1", "key2":"value2"}
r = requests.get("http://httpbin.org/get", params=payload)
打印的url會被正確編碼
?
3.響應內容:
1.文本相應內容? ?2.二進制相應內容? 3.json響應內容? 4.原始相應內容
1.text? ? ? ? ? ? ? ? ? ?2.?content? ? ? ? ? ? ? 3.json()? ? ? ? ? 4.raw? ? (確定設置了stram=true)
?
4.定制請求頭:
Requests不會給予定制header的具體情況改變自己的行為。只不過在最后的請求中,所有的header信息會被傳遞。
所有的header值必須是string、bytesting或者unicode。盡管傳遞unicode?header也是允許的,但不建議這樣使用。
?
5.更加復雜的post請求:
1.自動編碼表單格式:
如: r = requests.post('https://httpbin.org/post', data=payload)
自動編碼為表單格式:
{
““””
”form“ : {
“key1”:"value1"
"key2":"value2"
}
”“””
}
或是元祖類型
>>> payload = (('key1', 'value1'), ('key1', 'value2')) >>> r = requests.post('http://httpbin.org/post', data=payload) >>> print(r.text) { ... "form": { "key1": [ "value1", "value2" ] }, ... }很多時候你想要發送的數據并非編碼為表單形式的。如果你傳遞一個?string?而不是一個?dict,那么數據會被直接發布出去。
例如,Github API v3 接受編碼為 JSON 的 POST/PATCH 數據:
>>> import json>>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some': 'data'} >>> r = requests.post(url, data=json.dumps(payload))此處除了可以自行對?dict?進行編碼,你還可以使用?json?參數直接傳遞,然后它就會被自動編碼。這是 2.4.2 版的新加功能:
>>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some': 'data'} >>> r = requests.post(url, json=payload)6.POST一個多部分編碼(Multipart-Encoded)的文件
Requests 使得上傳多部分編碼文件變得很簡單:
>>> url = 'http://httpbin.org/post' >>> files = {'file': open('report.xls', 'rb')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }你可以顯式地設置文件名,文件類型和請求頭:
>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }如果你想,你也可以發送作為文件來接收的字符串:
>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "some,data,to,send\\nanother,row,to,send\\n" }, ... }7.響應狀態碼
我們可以檢測響應狀態碼:
>>> r = requests.get('http://httpbin.org/get') >>> r.status_code 200為方便引用,Requests還附帶了一個內置的狀態碼查詢對象:
>>> r.status_code == requests.codes.ok True如果發送了一個錯誤請求(一個 4XX 客戶端錯誤,或者 5XX 服務器錯誤響應),我們可以通過?Response.raise_for_status()?來拋出異常:
>>> bad_r = requests.get('http://httpbin.org/status/404') >>> bad_r.status_code 404 >>> bad_r.raise_for_status() Traceback (most recent call last): File "requests/models.py", line 832, in raise_for_status raise http_error requests.exceptions.HTTPError: 404 Client Error但是,由于我們的例子中?r?的?status_code?是?200?,當我們調用?raise_for_status()時,得到的是:
>>> r.raise_for_status() None ?8.響應頭
響應頭大小寫不敏感,語法匹配
r.headers['content-type']獲取響應頭中的content-type信息
?
9.cookie
1.響應中包含一些cookie,可以快速訪問使用,發送你的cookies到服務器,可以使用cookies參數
url = 'http://example.com/some/cookie/setting/url' >>> r = requests.get(url) >>> r.cookies['example_cookie_name']url = 'http://httpbin.org/cookies'
cookies = dict(cookies_are = 'working')
r = requests.get(url, cookies=cookies)
2.cookie的返回對象為RequestsCookieJar ,它的行為和字典類似,但界面更為完整,適跨域名跨路徑使用。你還可以吧Cookie Jar?傳到Request中:
>>> jar = requests.cookies.RequestsCookieJar() >>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies') >>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere') >>> url = 'http://httpbin.org/cookies' >>> r = requests.get(url, cookies=jar) >>> r.text '{"cookies": {"tasty_cookie": "yum"}}'?
重定向與請求歷史?:
Response.history?是一個 Response?對象的列表,?為了完成請求而創建了這些對象。這個對象按照從老到最近的請求進行排序。
使用GET、OPTION/POST/PUT/PATCH或者DELETE,?那么你可以通過allow_redirects參數急用重定向處理:
r = requests.get('http://github.com', allow_redirects = Flase)
r.status_code
輸出301錯誤,域名錯誤,沒有重定向到下一個網址
r.history
輸出為空列表
使用HEAD,你也可以啟用重定向:
r? = requests.head('http://github.com', allow_redirets = True)
r.url
輸出: 'http://github.com/'
r.history
[<Response[301]>]
?
超時:
告訴requests在經過以timeout參數設定的秒數時間之后停止等待響應。進本上所有的生產代碼都應該使用這一參數。如果不是用,?你的程序可能永遠失去響應:
>>> requests.get('http://github.com', timeout=0.001) Traceback (most recent call last): File "<stdin>", line 1, in <module> requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)如圖控制臺會顯示Traceback (most recent call last)? 回溯(最近一次調用)
也就是說,在timeout秒內沒有從基礎套接字接收到任何字節的數據時
?
?
錯誤與異常:
遇到網絡問題(如: DNS查詢失敗、拒絕連接等)時, Requests會拋出一個ConnectionError異常。
如果HTTP請求返回了不成功的狀態碼,Requests.raise_for_status()會拋出一個HTTPError異常。
若請求超時,?則拋出一個Timeout異常。
若請求超過了設定的最大重定向次數,?則會拋出一個TooManyRedirects異常。
所有Requests顯示拋出的一行都繼承自requests.exceptions.RequestException。
?
?
?
?
轉載于:https://www.cnblogs.com/unameisxl/p/8669648.html
總結
- 上一篇: BZOJ2843: 极地旅行社
- 下一篇: python的一些 简单算法