python 网络请求类库 requests 使用
requests是 为python封装的强大 REST 操作类库
1: 安装,请使用 pip,或是 easy_install 工具
sudo pip install requests
2: 使用 先
import requests
#coding=utf-8 #要加上编码设置,不然编译不通过,这是python2的问题 ''' Created on 2014年4月22日 @author: dev.keke@gmail.com ''' #测试 request库环境,python2.7环境 import requests #GET 请求 r = requests.get('http://httpbin.org/get') print 'GET:',r.text #POST 请求 r = requests.post('http://httpbin.org/post') print 'POST',r.text #GET 带参数请求, pararms = {'key1':'value1','key2':'value2'} r = requests.get('http://httpbin.org/get',params=pararms) print 'GET Pararms',r.url,r.text #POST 带参数请求, parar={'key1':'value1','key2':'value2'} r = requests.post('http://httpbin.org/post',params = parar) print 'POST Pararms:',r.url,r.text #改变响应数据的编码 r.encoding = 'ISO-8859-1' #取得响应的二进制数据 r.content #取得json数据,如果数据json处理失败,会抛出异常 r.json() #响应原始数据内容,注意设置 r = requests.get('https://github.com/timeline.json', stream=True) tream = True r.raw #原数据内容
3:一些更为复杂的操作
定制请求头
>>> import json >>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some': 'data'} >>> headers = {'content-type': 'application/json'} >>> r = requests.post(url, data=json.dumps(payload), headers=headers)
复杂的post请求
>>> payload = {'key1': 'value1', 'key2': 'value2'} >>> r = requests.post("http://httpbin.org/post", data=payload) >>> print r.text { ... "form": { "key2": "value2", "key1": "value1" }, ... }
>>> import json >>> url = 'https://api.github.com/some/endpoint' >>> payload = {'some': 'data'} >>> r = requests.post(url, data=json.dumps(payload))
上传文件
>>> url = 'http://httpbin.org/post' >>> files = {'file': open('report.xls', 'rb')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }
>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.xls', open('report.xls', 'rb'))} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "<censored...binary...data>" }, ... }
>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.csv', 'some,data,to,send another,row,to,send ')} >>> r = requests.post(url, files=files) >>> r.text { ... "files": { "file": "some,data,to,send\nanother,row,to,send\n" }, ... }
响应状态码:
内置状态码:
>>> r.status_code == requests.codes.ok
True
根据状态码抛出异常
>>> bad_r = requests.get('http://httpbin.org/status/404') >>> bad_r.status_code 404 >>> bad_r.raise_for_status() Traceback (most recent call last): File "requests/models.py", line 832, in raise_for_status raise http_error requests.exceptions.HTTPError: 404 Client Error
查看响应头
>>> r.headers { 'status': '200 OK', 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'connection': 'close', 'server': 'nginx/1.0.4', 'x-runtime': '148ms', 'etag': '"e1ca502697e5c9317743dc078f67693f"', 'content-type': 'application/json; charset=utf-8' }
设置请求超时时间
>>> requests.get('http://github.com', timeout=0.001) Traceback (most recent call last): File "<stdin>", line 1, in <module> requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
参考:http://cn.python-requests.org/zh_CN/latest/user/quickstart.html