Python3自帶的http.client和urllib.request都能發送http請求,不過相對來說使用較麻煩,第三方庫requests讓發送請求更簡單,支持自動編碼解碼,會話保持,長連等
requests安裝
- Windows: 打開cmd命令行,輸入
pip install requests
,等待安裝完成即可 - Linux: (建議使用Python3),終端中輸入
pip3 install requests
,等待安裝完成即可 - Mac: (建議使用Python3),
sudo python3 -m pip install requests
,等待安裝完成即可
驗證是否安裝成功:
打開命令行,輸入python
,在python shell環境下輸入import requests
沒有報錯即安裝成功
requests的使用
一個最簡單的GET請求
發送一個請求分3步:
- 組裝請求: 請求可能包含url,params(url參數),data(請求數據),headers(請求頭),cookies等,最少必須有url
- 發送請求,獲取響應:支持get,post等各種方法發送,返回的是一個響應對象
- 解析響應: 輸出響應文本
打開Pycharm,新建一個demo項目,項目下新建一個Python文件,輸入以下內容:
# 導入requests包 import requests # 1. 組裝請求 url = "http://httpbin.org/get" # 這里只有url,字符串格式 # 2. 發送請求,獲取響應 res = requests.get(url) # res即返回的響應對象 # 3. 解析響應 print(res.text) # 輸出響應的文本
帶參數的GET請求
import requests url = "http://www.tuling123.com/openapi/api?key=ec961279f453459b9248f0aeb6600bbe&info=你好" # 參數可以寫到url里 res = requests.get(url=url) # 第一個url指get方法的參數,第二個url指上一行我們定義的接口地址 print(res.text)
或
import requests
url = "http://www.tuling123.com/openapi/api" params = {"key":"ec961279f453459b9248f0aeb6600bbe","info":"你好"} # 字典格式,單獨提出來,方便參數的添加修改等操作 res = requests.get(url=url, params=params) print(res.text)
傳統表單類POST請求(x-www-form-urlencoded)
import requests url = "http://httpbin.org/post" data = {"name": "hanzhichao", "age": 18} # Post請求發送的數據,字典格式 res = requests.post(url=url, data=data) # 這里使用post方法,參數和get方法一樣 print(res.text)
JSON類型的POST請求(application/json)
import requests url = "http://httpbin.org/post" data = '''{ "name": "hanzhichao", "age": 18 }''' # 多行文本, 字符串格式,也可以單行(注意外層有引號,為字符串) data = '{"name": "hanzhichao", "age": 18}' res = requests.post(url=url, data=data) # data支持字典或字符串 print(res.text)
requests庫詳解
請求方法
- requests.get()
- requests.post()
- requests.put()
... - requests.session(): 用於保持會話(session)
除了requests.session()外,其他請求方法的參數都差不多,都包含url,params, data, headers, cookies, files, auth, timeout等等
請求參數
- url: 字符串格式,參數也可以直接寫到url中
- params:url參數,字典格式
- data: 請求數據,字典或字符串格式
- headers: 請求頭,字典格式
- cookies: 字典格式,可以通過攜帶cookies繞過登錄
- files: 字典格式,用於混合表單(form-data)中上傳文件
- auth: Basic Auth授權,數組格式
auth=(user,password)
- timeout: 超時時間(防止請求一直沒有響應,最長等待時間),數字格式,單位為秒
響應解析
- res.status_code: 響應的HTTP狀態碼
- res.reason: 響應的狀態碼含義
- req.text:響應的文本格式,按req.encoding解碼
- req.content: 響應的二進制格式
- req.encoding: 解碼格式,可以通過修改
req.encoding='utf-8'
來解決一部分中文亂碼問題 - req.apparent_encoding:真實編碼,由chardet庫提供的明顯編碼
- req.json(): (注意,有括號),響應的json對象(字典)格式,慎用!如果響應文本不是合法的json文本,或報錯
- req.headers: 響應頭
- req.cookies: 響應的cookieJar對象,可以通過
req.cookies.get(key)
來獲取響應cookies中某個key對應的值