Requests
Requests模塊
Requests模塊是一個用於網絡訪問的模塊,其實類似的模塊有很多,比如urllib,urllib2,httplib,httplib2,他們基本都提供相似的功能。
在上一篇我們已經使用urllib模塊
而Requests會比urllib更加方便,可以節約我們大量的工作,它更加強大,所以更建議使用Requests。
各種請求方式
requests里提供各種請求方式
HTTP定義了與服務器進行交互的不同方式, 其中, 最基本的方法有四種: GET, POST, PUT, DELETE; 一個URL對應着一個網絡上的資源, 這四種方法就對應着對這個資源的查詢, 修改, 增加, 刪除四個操作.上面的程序用到的requests.get()來讀取指定網頁的信息, 而不會對信息就行修改, 相當於是"只讀". requests庫提供了HTTP所有基本的請求方式, 都是一句話搞定。
requests請求方法

請求示例
r = requests.get(‘https://github.com/timeline.json’) # GET請求 r = requests.post(“http://httpbin.org/post”) # POST請求 r = requests.put(“http://httpbin.org/put”) # PUT請求 r = requests.delete(“http://httpbin.org/delete”) # DELETE請求 r = requests.head(“http://httpbin.org/get”) # HEAD請求 r = requests.options(“http://httpbin.org/get” ) # OPTIONS請求
以上方法均是在此方法的基礎上構建
requests.request(method, url, **kwargs)
返回值屬性
import requests respone=requests.get('http://www.jianshu.com') # respone屬性 print(respone.text)# 所請求網頁的內容 print(respone.content) print(respone.status_code) #返回狀態碼 print(respone.headers)# 網頁的頭 print(respone.cookies)# 網頁的cookie內容 print(respone.cookies.get_dict()) print(respone.cookies.items()) print(respone.url) # 實際的網址 print(respone.history) print(respone.encoding) # 所請求網頁的編碼方式
GET請求:requests.get(url)
import requests
response = requests.get('http://httpbin.org/get') # 返回一個實例,包含了很多的信息
print(response.text) # 所請求網頁的內容
帶參數的GET請求:requests.get(url, param=None)
通常我們會通過httpbin.org/get?key=val方式傳遞。Requests模塊允許使用params關鍵字傳遞參數,以一個字典來傳遞這些參數。
比如我們想傳遞key1=value1,key2=value2到http://httpbin.org/get里面
構造的url:http://httpbin.org/get?key1=value1&key2=value2
import requests
data = {
"key1":"key1",
"key2":"key2"
}
response = requests.get("http://httpbin.org/get",params=data)
print(response.url)
運行結果如下
C:\Pycham\venv\Scripts\python.exe C:/Pycham/demoe3.py http://httpbin.org/get?key1=key1&key2=key2 Process finished with exit code 0
可以看到,參數之間用&隔開,參數名和參數值之間用=隔開。
上述兩種的結果是相同的,通過params參數傳遞一個字典內容,從而直接構造url。
注意:通過傳參字典的方式的時候,如果字典中的參數為None則不會添加到url上。
POST請求:requests.post(url, data=data)
requests.post()用法與requests.get()完全一致,特殊的是requests.post()有一個data參數,用來存放請求體數據
注意:同樣的在發送post請求的時候也可以和發送get請求一樣通過headers參數傳遞一個字典類型的數據
import requests
data = {
"name":"zhaofan",
"age":23
}
response = requests.post("http://httpbin.org/post",data=data)
print(response.text)
運行結果如下:
可以看到參數傳成功了,然后服務器返回了我們傳的數據。
C:\Pycham\venv\Scripts\python.exe C:/Pycham/demoe3.py
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "23",
"name": "zhaofan"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "19",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.19.1"
},
"json": null,
"origin": "218.200.145.68",
"url": "http://httpbin.org/post"
}
定制請求頭和cookie信息
import requests import json data = {'some': 'data'} cookie = {'key':'value'} headers = {'content-type': 'application/json', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'} r = requests.post('https://api.github.com/some/endpoint', data=data, headers=headers,cookies =cookie) print(r.text)
設置請求超時與代理
import requests import json data = {'some': 'data'} proxies = {'http':'ip1','https':'ip2' } r = requests.post('https://api.github.com/some/endpoint', data=data,proxies=proxies,timeout = 1) print(r.text)
傳送json格式數據
有時候我們需要傳送的信息不是表單形式的,需要我們傳JSON格式的數據過去,所以我們可以用 json.dumps() 方法把表單數據序列化
import json
import requests
url = 'http://httpbin.org/post'
data = {'some': 'data'}
r = requests.post(url, data=json.dumps(data))
print r.text
運行結果如下:
C:\Pycham\venv\Scripts\python.exe C:/Pycham/demoe3.py
{
"args": {},
"data": "{\"some\": \"data\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Connection": "close",
"Content-Length": "16",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.19.1"
},
"json": {
"some": "data"
},
"origin": "218.200.145.68",
"url": "http://httpbin.org/post"
}
上傳文件
如果想要上傳文件,那么直接用 file 參數即可
import requests
url = 'http://httpbin.org/post'
files = {'file': open('test.txt', 'rb')}
r = requests.post(url, files=files)
print r.text
運行結果如下
{
"args": {},
"data": "",
"files": {
"file": "Hello World!"
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "156",
"Content-Type": "multipart/form-data; boundary=7d8eb5ff99a04c11bb3e862ce78d7000",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.9.1"
},
"json": null,
"url": "http://httpbin.org/post"
}
解析json
import requests
import json
response=requests.get('http://httpbin.org/get')
res1=json.loads(response.text) #太麻煩
res2=response.json() #直接獲取json數據
print(res1 == res2) #True
那r.text和r.content的區別是什么呢?
r.text是unicode編碼的響應內容(r.text is the content of the response in unicode)
r.content是字符編碼的響應內容(r.content is the content of the response in bytes)
text屬性會嘗試按照encoding屬性自動將響應的內容進行轉碼后返回,如果encoding為None,requests會按照chardet(這是什么?)猜測正確的編碼
如果你想取文本,可以通過r.text, 如果想取圖片,文件,則可以通過r.content
針對響應內容是二進制文件(如圖片)的場景,content屬性獲取響應的原始內容(以字節為單位)
