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"
相应内容介绍

相关文章: