python的requests用法详解
python接口測試Requests用法詳解
Requests是一個Python語言寫的http相關設置或者請求的一個庫
安裝:pip install Requests或者pip3 install requests
使用的時候要import requests
http://httpbin.org/:這個鏈接可以用來檢查你請求的鏈接返回的內容,輸出的是你請求的基本內容,可以用來測試驗證
get請求
1.基本get請求的寫法:
import requests
response = requests.get("http://httpbin.org/get")
print(response.text)
打印出你的請求頭,請求鏈接,IP地址等
2.帶參數的get請求(在鏈接的后面加上問號再加參數):
Response = requests.get("http://httpbin.org/get?name=germey&age=22")
# 還有一種方式:就是先定義一個字典,然后調用get方法的時候,將字典賦值給給params參數
data = {
‘name’:’germey’,
‘age’:22
}
response = requests.get("http://httpbin.org/get",params=data)
print(response.text)
3.解析json
Json用來保存一些鍵值對組成的數據,用于數據交換,也可用于前后端之間互相傳遞數據,比如前端發起請求,調用接口,后端返回一串json數據,處理數據,渲染到頁面上。
Request模塊中也有解析json的方法:
import requests
response = requests.get("http://httpbin.org/get")
print(type(response.text))
print(response.json())
print(type(response.json()))
還可以這樣寫:
Import requests
Import json
response = requests.get("http://httpbin.org/get")
#和request.json()是一個意思,都是打印出一個字典數據,這個json()方法也是調用了json的loads方法
print(json.loads(requests.test()))
4.獲取二進制數據
一般用來下載圖片、視頻等
response = requests.get("http://github.com/favicon.ico") #將要下載的圖片鏈接放這
print(type(response.text),type(response.content)) #類型分別是str和bytes
print(response.text)
print(response.content) #獲取二進制數據的方法
圖片的二進制數據獲取到后怎么保存呢?
import requests
response = requests.get("http://github.com/favicon.ico")
with open("favicon.ico","wb") as f:
f.write(response.content)
f.close()
5.添加headers
有時候不加headers發請求的時候會直接被拒絕或者服務器錯誤等,加上headers就可以了。
比如下面這段會報500錯誤:
response = requests.get("https://www.zhihu.com/expiore")
print(response.text)
此時需要添加一個headers:
1 headers = {
2
3 "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"
4
5 }
6
7 response = requests.get("https://www.zhihu.com/expiore",headers=headers)
8
9 print(response.text)
基本post請求,和get請求類似
6.需要的表單數據也用一個字典存起來給data參數,headers和get方法一樣
Import requests
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"
}
data = {
‘name’:’germey’,
‘age’:22
}
# 需要注意和get方法不同的是如果有參數用的是data=而不是params=
response = requests.post("https://www.zhihu.com/expiore",data = data,headers = headers)
print(response.json())
響應
7.response屬性
response = requests.post("https://www.jianshu.com")
print(type(response.status_code),response.status_code)
print(type(response.headers),response.headers)
print(type(response.cookies),response.cookies)
print(type(response.url),response.url)
print(type(response.history),response.history) #歷史記錄
8.狀態碼判斷
1 response = requests.post("https://www.jianshu.com")
2
3 exit() if not response.status_code==200 else print("request sucessfully")
4
5 或者可以寫成:
6
7 exit() if not response.status_code==request.codes.ok else print("request sucessfully")
狀態碼和request.codes列表中的英文狀態對應表
|
狀態碼 |
英文 |
|
100 |
("continue",) |
|
101 |
("switching_protocols") |
|
102 |
("processing",) |
|
103 |
("checkpoint",) |
|
122 |
("url_too_long","request_url_too_long") |
|
200 |
("ok","okay","all_ok","all_good",\o/,"√") |
|
201 |
("created",) |
|
202 |
("accepted",) |
|
203 |
("non_authoritative_info","non_authoritative_information") |
|
204 |
("no_content",) |
|
205 |
("reset_content","reset") |
|
206 |
("partial_content","partial") |
|
207 |
("multi_status","multiple_status","multi_stati","multiple_stati") |
|
208 |
("already_reported",) |
|
300 |
("multiple_choices",) |
|
301 |
("moved_permanentiy","moved","\o-") |
|
302 |
("found",) |
|
303 |
("see_other","other") |
|
304 |
("not_modified") |
|
305 |
("use_proxy") |
|
306 |
("switch_proxy") |
|
307 |
("temporary_redirect","remporary_moved","temporary") |
|
308 |
("permanent_redirect","resume_incomplete","resume") |
|
400 |
("bad_request","bad") |
|
401 |
("unauthorized",) |
|
402 |
("payment_required","payment") |
|
403 |
("forbidden",) |
|
404 |
("not_found","-o-") |
|
405 |
("method_not_allowed","not_allowed") |
|
406 |
("not_acceptable",) |
|
407 |
("proxy_authentication_required","proxy_auth","proxy_authentication") |
|
408 |
("request_timeout","timeout") |
|
409 |
("conflict",) |
|
410 |
("gone",) |
|
411 |
("length_required",) |
|
412 |
("precondition_falled","precondition") |
|
413 |
("request_entity_too_large",) |
|
414 |
("request_uril_too_large",) |
|
415 |
("unsupported_media_type","unsupported_media","media_type") |
|
416 |
("requested_range_not_satisfiable"," requested_range"," range_not_satisfiable") |
|
417 |
("expectation_failed",) |
|
418 |
("im_a_teapot","teapot","i_am_a_teapot") |
|
421 |
("misdirected_request",) |
|
422 |
("unprocessable_entity","unprocessable") |
|
423 |
("locked",) |
|
424 |
("failed_dependency","dependency") |
|
425 |
("unordered_collection","unordered") |
|
426 |
("upgrade_required","upgrade") |
|
428 |
("precondition_required","precondition") |
|
429 |
("too_many_requests","too_mary") |
|
431 |
("header_fields_too_large"," fields_too_large") |
|
444 |
("no_response","none") |
|
449 |
("retry_with","retry") |
|
450 |
("unavallable_for_legal_reasons","parental_controls") |
|
451 |
("unavallable_for_legal_reasons","legal_reasons") |
|
499 |
("client_closed_request",) |
|
500 |
("internal_server_error","server_error","/o\","×") |
|
501 |
("not_implemented",) |
|
502 |
("bad_gateway",) |
|
503 |
("service_unavaliable","unavaliable") |
|
504 |
("gateway_timeout") |
|
505 |
("http_version_not_supported","http_version") |
|
506 |
("variant_also_negotiates",) |
|
507 |
("insufficient_storage",) |
|
509 |
("bandwidth_limit_exceeded","bandwidth") |
|
510 |
("not_extended",) |
|
511 |
("network_authentication_required","network_auth","network_authentication") |
request的高級操作
文件上傳
1 import requests
2
3 files = {"file":open("test.png",'rb')}
4
5 response = requests.post("http://httpbin.org/post",files=files) #需要用post方法
6
7 print(response.text)
text返回的files是一個文件字節流
獲取cookie
1 response = requests.get("http://www.baidu.com")
2
3 print(response.cookies)
4
5 for key,value in response.cookies.items():
6
7 print(key + "=" + value)
會話維持:用來模擬登錄
1 requests.get("http://httpbin.org/cookies/set/number/1234") #調用cookies的set方法設置cookies
2
3 response = requests.get("http://httpbin.org/cookies") #獲取cookies
4
5 print(response.cookies)
這樣結果出來是空的,因為你請求了兩次get方法,等于是兩個瀏覽器各自請求
修改一下:
1 s = requests.Session()
2
3 s.get("http://httpbin.org/cookies/set/number/1234")
4
5 response = s.get("http://httpbin.org/cookies")
6
7 print(response.text)
證書驗證
#這個12306的證書是一個不安全的,直接請求會報錯:SSL error證書錯誤
response = requests.get("http://www.12306.cn")
# 這樣改之后就返回200ok了,但是會有警告
response = requests.get("http://www.12306.cn",verfiy=False)
再修改:
1 from requests.packages import urllib3
2
3 urllib3.disable_warnings()
4
5 response = requests.get("http://www.12306.cn",verfiy=False)
6
7 print(response.text)
這樣就沒有警告了
代理設置
設置http或者https代理,并且沒有用戶名密碼的情況下:
1 Import requests
2
3 proxies = {
4
5 "http":"http://127.0.0.1:9743/",
6
7 "https":"https://127.0.0.1:9743/"
8
9 }
10
11 response = requests.get("https://www.taobao.com",proxies=proxies)
12
13 print(response.status_code)
設置http或者https代理,有用戶名密碼
proxies = {
"http":" http://user:password@ 127.0.0.1:9743/"
}
response = requests.get("https://www.taobao.com",proxies=proxies)
print(response.status_code)
如果代理不是http或者https,是socks4或者socks5,則字典的鍵值還是http,但是值變了:
首先需要pip install "requests[socks]"
Import requests
proxies = {
"http":"socks5://127.0.0.1:9743/",
"https":"socks5://127.0.0.1:9743/"
}
response = requests.get("https://www.taobao.com",proxies=proxies)
print(response.status_code)
超時設置
import requests
response = requests.get("https://www.taobao.com",timeout=1) #設置超過1秒就算超時
print(response.status_code)
超時以后會報一個異常:ReadTimeout
可以使用try捕獲異常,修改代碼為:
Import requests
from requests.exceptions import ReadTimeout
try:
response = requests.get("https://www.taobao.com",timeout=1) #設置超過1秒就算超時
print(response.status_code)
except ReadTimeout:
print("timeout")
認證設置
有寫網址需要用戶名密碼登錄后才可以看到內容,則:
import requests
from requests.auth import HTTPBasicAuth
r = requests.get("http://120.27.34.24:9001",auth=HTTPBasicAuth("user","123"))
print(r.status_code)
或者第二種寫法:
Import requests
r=requests.get("http://120.27.34.24:9001",auth= ("user","123"))
print(r.status_code)
異常處理
import requests
from requests.exceptions import ReadTimeout,HTTPError,ConnectionError,RequestException
try:
response = requests.get("https://www.taobao.com",timeout=1)
print(response.status_code)
except ReadTimeout:
print("timeout")
except HTTPError: #http異常
print("http error")
except ConnectionError: #網絡不好
print("ConnectionError")
except RequestException: #父類異常
print("error")
總結
以上是生活随笔為你收集整理的python的requests用法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都小吃在哪里 探寻成都美食的最佳去处?
- 下一篇: 腌菜为什么要用粗盐?