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可以轻而易举的完成浏览器可有的任何操作。
requests库特性:
- Keep-Alive & 连接池
- 国际化域名和 URL
- 带持久 Cookie 的会话
- 浏览器式的 SSL 认证
- 自动内容解码
- 基本/摘要式的身份认证
- 优雅的 key/value Cookie
- 自动解压
- Unicode 响应体
- HTTP(S) 代理支持
- 文件分块上传
- 流下载
- 连接超时
- 分块请求
- 支持 .netrc
1. 安装模块
安装: pip install requests 更新: pip install --upgrade requests
2. 使用模块
HTTP的请求类型有POST,GET,PUT,DELETE,HEAD 以及 OPTIONS,其中POST和GET是最常使用的。
GET请求
import requests # 无参数示例 r = requests.get('https://httpbin.org/get') # 有参数示例 r = requets.get('http://httpbin.org/get', params=d) 传递URL参数: 在URL中常见?符号,http://httpbin.org/get?key=val 这种带有?传递关键字参数的方式,requests可以通过params实现。 d = {'k1':'v1', 'k2':'v2', 'k3':None, 'k4':['v4','v5']} # 字典中键值为None的键不会被添加到URL中 # 多个键值中间用&符号连接 # 键值可是列表 例如'k4' print(r.url) 执行结果为:http://httpbin.org/get?k1=v1&k2=v2&k4=v4&k4=v5
POST请求
# 1、基本POST实例 import requests payload = {'key1': 'value1', 'key2': 'value2'} ret = requests.post("http://httpbin.org/post", data=payload) print(ret.text) # 输出结果 { "args": {}, "data": "", "files": {}, "form": { "key1": "value1", "key2": "value2" }, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Content-Length": "23", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "python-requests/2.18.4" }, "json": null, "origin": "不告诉你这里返回的是你的IP地址", "url": "http://httpbin.org/post" } # 2、发送请求头和数据实例 import requests import 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) # 输出结果 {"message":"Not Found","documentation_url":"https://developer.github.com/v3"} <RequestsCookieJar[]>
关于响应内容
requests模块的返回对象是一个Response对象,可以从这个对象中获取需要的信息。下面 r 代表Response对象。
- r.text 文本响应内容
- r.context 二进制响应内容
- r.json() JSON响应内容
- r.raw 原始相应内容
# 文本响应内容 Response对象包含很多信息,Requests可以自动对大多数unicode字符集无缝解码。 请求发出后,Requests会基于HTTP头部对响应的编码做出有根据的推测。 我们可以通过r.encoding得到编码,也可以使用r.encoding属性改变编码 #二进制响应内容 对于非文本请求r.content,Requests会自动解码gzip和deflate传输编码的响应内容。 # JSON相应内容 需要注意如果JSON解码失败,r.json()会抛出异常。然而成功调用r.json()并不意味着响应成功,因为某些服务器失败 的相应中也会包含一个JSON对象,这种JSON会被解码返回。如果要判断请求是否成功,可以使用r.raise_for_status() 或者检查r.status_code是否和预期相同。 # 原始相应内容 如果需要获取服务器的原始套接字相应,可以使用r.raw,使用时要确保在初始请求中设置了 stream=True r = requests.get('https://httpbin.org/get', stream=True) print(r.raw) print(r.raw.read(10)) # 结果输出 <urllib3.response.HTTPResponse object at 0x061665F0> b'{\n "args"