Python requests模块学习

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner

其功能有以下:

  • 国际化域名和 URLs
  • Keep-Alive & 连接池
  • 持久的 Cookie 会话
  • 类浏览器式的 SSL 加密认证
  • 基本/摘要式的身份认证
  • 优雅的键/值 Cookies
  • 自动解压
  • Unicode 编码的响应体
  • 多段文件上传
  • 连接超时
  • 支持 .netrc
  • 适用于 Python 2.6—3.4
  • 线程安全

官方文档讲的非常好,链接如下:
英文文档:http://www.python-requests.org/en/master/
中文文档:http://docs.python-requests.org/zh_CN/latest/index.html
还有这篇博文也不错:http://blog.csdn.net/shanzhizi/article/details/50903748


前段时间在写一个小工具的时候我也使用过另一个模块urllib,个人觉得跟requests比起来确实繁杂了许多。

小工具要实现的功能是登录公司业务平台,然后请求设备上传到平台的原始报文数据,并保存到本地。
程序要做的事其实就是调两次接口:

  1. 登录平台(post)
  2. 请求接口获取原始报文数据(get)

(保存请求数据跟requests没啥关系就忽略了)

下面贴代码做个比较:

urllib版

from urllib.parse import urlparse
import urllib  
import urllib.request
import urllib.response
import http.cookiejar
import configparser

conf = configparser.ConfigParser()
conf.read("new_gps.conf")
# 登录的主页面
hosturl = conf.get("login", "hosturl")
# post数据接收和处理的页面(我们要向这个页面发送我们构造的Post数据)
posturl = conf.get("login", "posturl")
# 设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
cj = http.cookiejar.LWPCookieJar()
cookie_support = urllib.request.HTTPCookieProcessor(cj)
opener = urllib.request.build_opener(cookie_support, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
# 打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
h = urllib.request.urlopen(hosturl)
# 构造header,一般header至少要包含一下两项。
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
# 构造Post数据.
postData = {'email': conf.get("login", "email"),
            'password': conf.get("login", "password"),
            'url': conf.get("login", "url")
            }
# 需要给Post数据编码
postData = urllib.parse.urlencode(postData).encode('utf-8')
# 通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成登录过程
request = urllib.request.Request(posturl, postData, headers)
response = urllib.request.urlopen(request)
# 请求接口获取原始报文数据
download_url = conf.get("download", "url")
request = urllib.request.Request(download_url)
response = urllib.request.urlopen(request)
text = response.read()

嚯~就请求俩接口洋洋洒洒这么多行!!
(不过也不排除有更简单的写法,毕竟之前是从网上copy过来的代码改改了改,嘿嘿)
那么来看看用requests写是什么样的。

requests版

import requests
import json
import configparser

conf = configparser.ConfigParser()
conf.read("new_gps.conf")
url = conf.get("login", "posturl")
download_url = conf.get("download", "url")
postData = {'email': conf.get("login", "email"),
            'password': conf.get("login", "password"),
            'url': conf.get("login", "url")
            }
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
s = requests.Session()
# 登录
request = s.post(url, data=login, headers=headers, verify=False)
# 请求
request = s.get(download_url)
text = request.text

哇偶,看起来清爽了很多有木有?果然是requests君更人性化更优雅呀~

两者比较一下,会发现处理过程基本是一致的,但urllib比requests多了些什么呢?

  • 有木有发现urllib在import的时候就已经比requests多好多啊
  • 在保存cookie方面,urllib君看起来真是挺费事,但requests的session就非常方便啦

会话对象requests.Session能够跨请求地保持某些参数,比如cookies,即在同一个Session实例发出的所有请求都保持同一个cookies,而requests模块每次会自动处理cookies,这样就很方便地处理登录时的cookies问题。在cookies的处理上会话对象一句话可以顶过好几句urllib模块下的操作。

你可能感兴趣的:(Python requests模块学习)