Requests 模塊說明:
支持HTTP連接保持和連接池吃型,支持cookie保持會話唧瘾,支持文件上傳喇勋,支持自動確定響應(yīng)內(nèi)容編碼缨该,支持國家化的URL和POST數(shù)據(jù)自動編碼。
requests模塊安裝
pip install requests
Requests模塊簡單入門:
import requests
# 嘗試獲取某個網(wǎng)頁,如:百度
r = requests.get('https://www.baidu.com/') # 訪問成功茄蚯,返回200
# 發(fā)送HTTP POST請求
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
# 對于其他的http請求的操作
r = requests.put('http://httpbin.org/put', data = {'key':'value'})
r = requests.delete('http://httpbin.org/delete')
r = requests.head('http://httpbin.org/get')
r = requests.options('http://httpbin.org/get')
帶參數(shù)的請求實(shí)例:
發(fā)送帶參數(shù)的get請求压彭,get請求是以關(guān)鍵字params傳遞參數(shù)的
發(fā)送帶參數(shù)的post請求睦优,post請求是以關(guān)鍵字data傳遞參數(shù)的
import requests
requests.get('http://www.dict.baidu.com/s', params={'wd': 'python'}) #GET參數(shù)實(shí)例
requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment': '測試POST'}) #POST參數(shù)實(shí)例
Post發(fā)送Json實(shí)例:
import requests
import json
r = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'}))
print(r.json())
Post一個文件:
url='https://www.baidu.com'
files={'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)
# 可以在post文件時指定文件名等額外的信息:
url = 'http://pythontab.com/postTest'
files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
r = requests.post(url, files=files)
傳遞url參數(shù)
如果是手工構(gòu)建的URL,數(shù)據(jù)會以鍵值對的模式存儲在URL中壮不,跟在一個問號的后面汗盘。如,login的api/user/login?username='tester'&passwd='aA123456'询一。 Requests允許使用params關(guān)鍵字參數(shù)隐孽,以一個字符串字典來提供這些參數(shù)
payload = {'username':'tester','passwd':'aA123456'}
r = requests.post('http://hostNmae/api/user/login',params=payload)
# 返回 200
print(r.url)# 通過打印輸出該 URL,URL 已被正確編碼
響應(yīng)內(nèi)容: 讀取服務(wù)器響應(yīng)內(nèi)容
Requests會自動解碼來自服務(wù)器的內(nèi)容健蕊。大多數(shù)的Unicode字符集都能被無縫解碼菱阵。
r = requests.get('https://www.baidu.com/')r
r.text # content of the response, in unicode
r.content # 以字節(jié)的方式訪問請求響應(yīng)體,
r.content.decode() # 加上decode方法
訂制請求頭
如果想為請求添加HTTP 頭部缩功,只要簡單傳遞一個dict給header就可以了晴及。
例如,指定content-type:
url = 'http://m.ctrip.com'
headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}
r = requests.post(url, headers=headers)
print(r.request.headers)
注意: 所有的 header 值必須是 string嫡锌、bytestring 或者 unicode虑稼。盡管傳遞 unicode header 也是允許的,但不建議這樣做势木。
更加復(fù)雜的POST請求
url = 'http://m.ctrip.com'
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload)) #如果傳遞的payload是string而不是dict蛛倦,需要先調(diào)用dumps方法格式化一下
返回狀態(tài)碼
r = requests.get('https://www.baidu.com/')
r.status_code
響應(yīng)頭
r = requests.get('https://www.baidu.com/')
print(r.headers)
print(r.headers['Content-Type'])
print(r.headers.get('content-type'))
設(shè)置訪問代理
#設(shè)置訪問代理
proxies = {
"http": "http://10.10.10.10:8888",
"https": "http://10.10.10.100:4444",
}
r = requests.get('http://m.ctrip.com', proxies=proxies)
下載頁面
r=requests.get("http://www.pythontab.com")
with open("haha.html","wb") as html:
html.write(r.content)
html.close()
Requests整合案例1:
import requests
import nnlog
import os
from conf.setting import LOG_PATH
class MyRequest:
log_file_name = os.path.join(LOG_PATH,'MyRequest.log')#日子文件名
time_out = 10 #請求超時時間
def __init__(self,url,data=None,headers=None,file=None):
self.url = url
self.data = data
self.headers = headers
self.file = file
def post(self):
try:
req = requests.post(self.url,data=self.data,headers=self.headers,
files=self.file,timeout=self.time_out)
except Exception as e:
res = {"status":0,"data":e.args} #0代表請求失敗
else:
try:
res = {"status":1,"data":req.json()} #1代表返回的json
except Exception as e:
res = {"staus":2,"data":req.text} #2代表返回不是json
log_str = 'url: %s 請求方式:post data:%s ,返回?cái)?shù)據(jù):%s'%(self.url,self.data,res)
self.write_log(log_str)
return res
def get(self):
try:
req = requests.get(self.url,params=self.data,headers=self.headers,timeout=self.time_out)
except Exception as e:
res = {"status":0,"data":e.args} #0代表請求失敗
else:
try:
res = {"status":1,"data":req.json()} #1代表返回的json
except Exception as e:
res = {"staus":2,"data":req.text} #2代表返回不是json
log_str = 'url: %s get請求 data:%s ,返回?cái)?shù)據(jù):%s'%(self.url,self.data,res)
self.write_log(log_str)
return res
@classmethod
def write_log(cls,content):
log = nnlog.Logger(cls.log_file_name)
log.debug(content)
參考文檔:http://docs.python-requests.org/zh_CN/latest/user/advanced.html#advanced