requests模塊 一、發送請求 向某個 發送get請求 發送一個post請求 發送其他類型的請求也都可以 二、傳遞url參數 get請求傳遞參數 post請求傳遞參數 三、響應內容 獲取響應的內容 二進位響應內容 json響應內容 四、指定請求頭 五、複雜的post請求 傳遞類似html表單的數 ...
requests模塊
一、發送請求
向某個
url
發送get請求requests.get("https://www.baidu.com")
發送一個post請求
requests.post("https://www.baidu.com",data={"name":"zhuyu"})
發送其他類型的請求也都可以
二、傳遞url參數
get請求傳遞參數
arg = {"name":"zhuyu","password":"123"} requests.get("www.baidu.com",params=ars)
post請求傳遞參數
data = {"key":"value"} requests.post("www.baidu.com",data=data)
三、響應內容
獲取響應的內容
response = requests.get("www.baidu.com") html = response.text # html就是網站的源碼 url = response.url # 請求的url
二進位響應內容
response.content # 返回的是二進位數據
json響應內容
response.json # 如果響應的是json格式,它會自動幫你處理json數據,如果不能轉換的話,會拋出異常 # 註意有的伺服器在失敗的響應也會返回json對象,請使用raise_for_status()或者status_code進行校驗
四、指定請求頭
url = "www.baidu.com"
headers = {
"user-agent":"xixi"
}
response = requests.get(url=url,headers=headers)
五、複雜的post請求
傳遞類似html表單的數據
url = "www.baidu,com" data = {"name":"zhuyu"} requests.post(url=url,data=data)
傳遞json格式數據
import json url = "www.baidu,com" data = {"name":"zhuyu"} # 方式一: requests.post(url=url,data=json.dumps(data)) # 方式二: requests.post(url=url,json=data)
六、上傳文件
url = "www.baidu,com"
files = {"file":open("a.txt","rb")}
requests.post(url=url,files=files)
七、響應狀態碼
response = requests.get("www.baidu.com")
status_code = response.status_code # 獲取狀態碼
# 如果返回一個400,500的狀態碼,可以通過raise_for_status()來拋出異常
八、響應頭
response.headers # 這是響應的頭部信息
九、cookie信息
獲取響應頭的cookie信息
cookie = response.cookie #獲取到cookie的字典
為requests設置cookie信息
# cookie它是RequestsCookieJar的對象 cookies = requests.cookoes.RequestsCookieJar() cookies.set("name","zhuyu") cookies.set("password":"123") requests.get(url,cookies=cookies)
十、重定向與請求歷史
history方法
這是response對象里的一個方法或者屬性,它是一個對象列表,按照從最老到最近的請求進行排序的
allow_redirects參數,模式為True的
response = requests.get(url=url,allow_redirects=False) # 上面代碼是禁止了重定向
十一、超時
你可以告訴reuqests在經過timeout參數設定的秒數時間之後停止等待響應
requests.get(url=url,timeout=5)
十二、錯誤與異常
錯誤 | 異常 |
---|---|
遇到網路問題 | Requests會拋出ConnectionError異常 |
返回了不成功的狀態碼 | Response會拋出raise_fir_status異常 |
請求超時 | 拋出Timeout異常 |
若請求超過了設定的最大重定向次數 | 拋出TooManyRedirects異常 |
十三、會話對象
會話對象讓你在能夠跨請求保持某些參數
# 拿到一個會話對象,這個會話同樣能實現requests中的方法
session = requests.Session()
# 通過會話對象發送一個get請求到url
session.get(url=url)
------------------------------------------------------
# 會話也可用來為請求方法提供數據
session = requests.Session()
session.headers.update({"name":"zhuyu"})
session.get(url,headers={"age":22})
# 此時在本次請求的請求中有name:"zhuyu"&age:22,這兩對鍵值對
------------------------------------------------------
# 上面這個只是在會話層面,如果在方法層面呢?參數是不會被跨請求保持的
session = requests.Session()
session.get(url=url,cookies={"name":"zhuyu"})
# 此時發送的get請求是帶上"name"="zhuyu"這是cookie的
# 下麵還是同一個session對象,我再發一個get請求,此時我沒有寫cookies這個參數
session.get(url=url)
# 結果:你會發現本次請求沒有帶上cookie
十四、請求與響應對象
response = requests.get(url=url)
# 列舉下這行代碼做了那幾步
# 1、生成了一個Request的對象,裡面包含著所攜帶的數據,將該對象發送到某個伺服器去請求
# 2、一旦響應之後,就會產生一個Response的對象,這個對象包含著伺服器傳來的數據
# 3、最後將這個Response對象賦值給了response這個變數
------------------------------------------------------------------------
response.headers # 就是響應的請求頭
response.request.headers # 就是請求的請求頭
十五、準備的請求(Prepared Request)
import requests
response = requests.get(url)
# 其實請求最終還是以session對象發送的,
session.send(Request對象,**kwargs)
-------------------------------------
from requests import Request,Session
session = Session()
req = Request("GET",url)
request=PreparedRequest(req)
# 官方文檔說,我們可以在session對象send之前,對PreparedRequest對象再進行一些操作
response = session.send(request,
stream=strean,
verify=verify,
proxies=proxies,
cert=cert,
timeout=timeout)
print (response.status_code)
十六、SSL證書驗證(verify)
Requests可以為HTTPS請求驗證SSL證書,SSL驗證預設是開啟的,驗證失敗的話會拋出SSLError異常
# 設置證書路徑
# 方式一:
request.get(url=url,verify=路徑)
# 方式二:
session = requests.Session()
session.verify = 路徑
# verify對應:SSL證書路徑
十七、客戶端證書(cret)
# cert :指定證書的路徑
requests.get(url=url,cert=路徑)
session = requests.Session()
session.cert = 路徑
十八、CA證書
requests
預設附帶了一套它信任的證書,如果系統中裝了certifi包,requests
會試圖使用它裡面的證書,這樣用戶就不需要在修改代碼的情況下更新他們信任的證書,所以我們經常更新certifi包
十九、響應體內容工作流
# stream:控制響應體內容的下載
response = requests.get(url,stream=True)
二十、流式上傳(stream)
# requests可以上傳文件
with open("a.txt","rb") as f:
requests.post(url,data=f)
# 註意:傳送的數據也就是文件,應該是一個文件對象
# 強烈建議建議使用二進位
二十一、post上傳多個分塊編碼的文件
files = []
二十二、事件掛鉤(hooks)
'''
可用的鉤子:response,從一個請求產生的響應
用法:傳遞一個字典給hooks這個變數 {hook_name:callback_function}
這個callback_function會接收一個數據塊作為它的第一個參數
hooks = dict(response=print_url)
'''
def print_url(response,*args,**kwargs):
pass
二十三、代理(proxies)
import requests
proxies = {
"http":"http://10.10.1.10:3128",
"https":"https://10.10.1.10:1080"
}
response = requests.get(url=url,proxies=proxies)