Python Requests库简明使用教程
来源:互联网 发布:midascft是什么软件 编辑:程序博客网 时间:2024/04/18 22:46
Python标准库中提供了:urllib等模块以供Http请求,但是,它的 API 太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。
发送GET请求
import urllib.request f = urllib.request.urlopen('http://www.webxml.com.cn//webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=424662508')result = f.read().decode('utf-8')发送携带请求头的GET请求
import urllib.request req = urllib.request.Request('http://www.example.com/')req.add_header('Referer', 'http://www.python.org/')r = urllib.request.urlopen(req) result = f.read().decode('utf-8')
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。
1. 安装模块
pip3 install requests
2. 使用模块
GET请求
# 1、无参数实例 import requests ret = requests.get('https://github.com/timeline.json') #执行此行代码,获得一个Response对象r,从r可以获取http请求的响应结果print(ret.url)print(ret.text) # 2、有参数实例 import requests payload = {'key1': 'value1', 'key2': 'value2'}ret = requests.get("http://httpbin.org/get", params=payload) print(ret.url)print(ret.text)
POST请求
# 1、基本POST实例 import requests payload = {'key1': 'value1', 'key2': 'value2'}ret = requests.post("http://httpbin.org/post", data=payload) print(ret.text) # 2、发送请求头和数据实例 import requestsimport json url = 'https://api.github.com/some/endpoint'payload = {'some': 'data'}headers = {'content-type': 'application/json'} ret = requests.post(url, data=json.dumps(payload), headers=headers) print(ret.text)print(ret.cookies)设置编码格式
url = 'http://news.sina.com.cn/china/'res = requests.get(url)# 使用UTF-8编码res.encoding = 'UTF-8'
构造URL
我们常常将http请求的参数以url的query string的形式进行发送,传统的做法是我们使用拼凑的方式构造这个url。例如我们需要构造以下这个url:
http://httpbin.org/get?key1=value1&key2=value2
使用reqeuets,你可以方便地构造这个url,而不用手工拼凑。你只需要将这些参数和值构造一个字典,然后将这个字典传给params参数即可:
d = {'key1': 'value1', 'key2': 'value2'}r = requests.get('http://httpbin.org/get', params=d)
输出:
http://httpbin.org/get?key2=value2&key1=value1你可以看到,key1和key2这两个参数已被正确附加到url的query string中。
HTTP响应正文
一个http响应的格式通常如下:
响应行
响应报头
响应正文
下面是请求 http://httpbin.org/ip 的http响应结果:
HTTP/1.1 200 OK Server: nginx Date: Thu, 07 Jul 2016 02:53:49 GMT Content-Type: application/json Content-Length: 31 Connection: keep-alive Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true [空行] { “origin”: “43.230.90.94” }
注意,响应正文与响应头部之间有一空行间隔。Requests已将http响应封装成Response对象,从Response对象可获取响应正文的内容。
响应正文文本
使用Response.text,可以获取响应的正文文本内容。
r = requests.get('http://httpbin.org/ip')print (r.text)
输出:{ “origin”: “218.107.63.234” }Requests会自动对响应正文进行解码:如果Response.encoding为空,那么requests会猜测响应的编码方式,然后进行解码。如果你可以确定响应的编码方式,也可以先对Response.encoding进行设置,然后再通过Response.text获取响应正文。
Json响应正文
如果响应正文是一json串,可以使用Response.json()方法对响应正文进行json decode操作,并返回一个字典。
r = requests.get('http://httpbin.org/ip')d = r.json()print (d)print (d['origin'])
输出:
{'origin': '171.11.1.101'}171.11.1.101
如果响应正文不是一个json串,则会报错。
响应状态
Response对象status_code属性标识http请求响应的状态码:
r = requests.get('http://httpbin.org/get')print (r.status_code)
如果状态码是40X或者50X,那么可以使用Response.raise_for_status()抛出一下异常:r = requests.get('http://httpbin.org/status/404')print (r.status_code)
404
响应返回404,故使用以下语句会抛出异常:
r.raise_for_status()
Traceback (most recent call last): raise HTTPError(http_error_msg, response=self) requests.exceptions.HTTPError: 404 Client Error: NOT FOUND for url: http://httpbin.org/status/404如果是返回200,则raise_for_status()并不会抛出异常。
r = requests.get('http://httpbin.org/status/200')print (r.status_code)r.raise_for_status()
响应的头部
Response对象的headers属性是一个字典,可以获得http响应结果的头部的相关信息:
r = requests.get('http://httpbin.org/headers')print (r.headers)
输出:{‘Content-Length’: ‘157’, ‘Server’: ‘nginx’, ‘Connection’: ‘keep-alive’, ‘Access-Control-Allow-Credentials’: ‘true’, ‘Date’: ‘Wed, 06 Jul 2016 15:53:36 GMT’, ‘Access-Control-Allow-Origin’: ‘*’, ‘Content-Type’: ‘application/json’}
定制请求的头部
Requests支持定制http请求的头部。为此,我们只需要构造一个字典,然后传给requests.get()的headers参数即可。
url = 'http://httpbin.org/headers'headers = {'user-agent': 'my-app/0.0.1'}r = requests.get(url, headers=headers)print (r.text)http://httpbin.org/headers 这个链接可以输出请求的头部,由于我们修改了请求头的user-agent字段,所以会访问这个链接会返回:
{ “headers”: { “Accept”: “/“, “Accept-Encoding”: “gzip, deflate”, “Host”: “httpbin.org”, “User-Agent”: “my-app/0.0.1” } }发送POST请求
一个http请求包括三个部分,为别为请求行,请求报头,消息主体,类似以下这样:
请求行
请求报头
消息主体
HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编码方式。服务端通过是根据请求头中的Content-Type字段来获知请求中的消息主体是用何种方式进行编码,再对消息主体进行解析。具体的编码方式包括:
application/x-www-form-urlencoded
最常见post提交数据的方式,以form表单形式提交数据。
application/json
以json串提交数据。
multipart/form-data
一般使用来上传文件。
以form形式发送post请求
Reqeusts支持以form表单形式发送post请求,只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。
url = 'http://httpbin.org/post'd = {'key1': 'value1', 'key2': 'value2'}r = requests.post(url, data=d)print (r.text)输出:
{ “args”: {}, “data”: “”, “files”: {}, “form”: { “key1”: “value1”, “key2”: “value2” }, “headers”: { …… “Content-Type”: “application/x-www-form-urlencoded”, …… }, “json”: null, …… }
可以看到,请求头中的Content-Type字段已设置为application/x-www-form-urlencoded,且d = {'key1': 'value1', 'key2': 'value2'}以form表单的形式提交到服务端,服务端返回的form字段即是提交的数据。
以json形式发送post请求
可以将一json串传给requests.post()的data参数,
url = 'http://httpbin.org/post's = json.dumps({'key1': 'value1', 'key2': 'value2'})r = requests.post(url, data=s)print (r.text)
输出:
{ “args”: {}, “data”: “{\”key2\”: \”value2\”, \”key1\”: \”value1\”}”, “files”: {}, “form”: {}, “headers”: { …… “Content-Type”: “application/json”, …… }, “json”: { “key1”: “value1”, “key2”: “value2” }, …… }
可以看到,请求头的Content-Type设置为application/json,并将s这个json串提交到服务端中。
Cookie设置
使用requests,可以轻松获取响应的cookies,和设置请求的cookies。
获取响应的cookies
r.cookies是响应cookies的字典,通过r.cookies可访问响应带上的cookies。
r = requests.get(url)print (r.cookies['example_cookie_name'])发送带cookies的请求
url = 'http://httpbin.org/cookies'cookies = {'cookies_are': 'working'}r = requests.get(url, cookies=cookies)print (r.text)输出:
{ “cookies”: { “cookies_are”: “working” } }请求的超时设置
Requests允许对一个http请求设置超时的时间,只需要在requests.get()或者requests.post()方法的timeout参数设置一个值(单位为秒)即可。
url = 'http://httpbin.org/get'r = requests.get(url, timeout=0.001)将会抛出一个超时异常:
raise ConnectTimeout(e, request=request) requests.exceptions.ConnectTimeout: HTTPConnectionPool(host=’httpbin.org’, port=80): Max retries exceeded with url: /get (Caused by ConnectTimeoutError(
异常
在发送http请求时,由于各种原因,requests可能会请求失败而抛出异常。常见的异常包括:
ConnectionError
由于网络原因,无法建立连接。
HTTPError
如果响应的状态码不为200,Response.raise_for_status()会抛出HTTPError 异常。
Timeout
超时异常。
TooManyRedirects
若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
所有requests抛出的异常都继承自 requests.exceptions.RequestException类。
小结
从以上介绍可以看到,requests在处理httpy请求和响应时可谓简单而直观,这也印证了requests的开发哲学:
Beautiful is better than ugly.(美丽优于丑陋)
Explicit is better than implicit.(清楚优于含糊)
Simple is better than complex.(简单优于复杂)
Complex is better than complicated.(复杂优于繁琐)
Readability counts.(重要的是可读性)
参考:http://blog.csdn.net/lihao21/article/details/51857385
阅读全文
1 0
- Python Requests库简明使用教程
- Python Requests库简明使用教程
- Python Requests 简明教程
- python-requests库的基本使用教程
- Python 爬虫教程 3 - 使用 requests
- Python requests库使用实例
- python的 requests库使用
- Python 中使用SQlite 数据库简明教程
- 简明Python教程 --- 14.Python标准库
- Python模拟登陆(使用requests库)
- Python库Requests的基础使用
- python requests 库使用小结(一)
- python requests 库使用小结(二)
- python中的requests使用
- Python-requests的使用
- 简明 Python 教程
- 简明 Python 教程
- 简明Python 教程 --模块
- 【简记】Operating System—— virtual memory
- C++基础复习
- 学Python写算法系列(一) | 直接插入排序
- Io 异常: The Network Adapter could not establish the connection
- Revit二次开发——读取构件的材料外观信息
- Python Requests库简明使用教程
- 《大唐姻缘传》(李治篇)第三章 顺朕意媚娘进宫 诞龙儿福运连连
- jquery学习之几种过滤选择器
- POJ 3190 Stall Reservations (贪心+优先队列)
- Redis数据结构和内部编码--有序集合(SortedSet)
- 从linux进程的角度看Docker
- OpenCV 图像清晰度评价(相机自动对焦)
- 最坏情况下保证时间复杂度为N*logN的快速排序
- struts2_拦截器的原理