Requests 是用Python語言編寫,基于 urllib,采用 Apache2 Licensed 開源協(xié)議的 HTTP 庫。它比 urllib 更加方便,可以節(jié)約我們大量的工作,完全滿足 HTTP 測試需求。Requests 的哲學是以 PEP 20 的習語為中心開發(fā)的,所以它比 urllib 更加 Pythoner。
其功能有以下:
- 國際化域名和 URLs
- Keep-Alive & 連接池
- 持久的 Cookie 會話
- 類瀏覽器式的 SSL 加密認證
- 基本/摘要式的身份認證
- 優(yōu)雅的鍵/值 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比起來確實繁雜了許多。
小工具要實現(xiàn)的功能是登錄公司業(yè)務平臺,然后請求設備上傳到平臺的原始報文數(shù)據(jù),并保存到本地。
程序要做的事其實就是調(diào)兩次接口:
- 登錄平臺(post)
- 請求接口獲取原始報文數(shù)據(jù)(get)
(保存請求數(shù)據(jù)跟requests沒啥關(guān)系就忽略了)
下面貼代碼做個比較:
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數(shù)據(jù)接收和處理的頁面(我們要向這個頁面發(fā)送我們構(gòu)造的Post數(shù)據(jù))
posturl = conf.get("login", "posturl")
# 設置一個cookie處理器,它負責從服務器下載cookie到本地,并且在發(fā)送請求時帶上本地的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數(shù)據(jù)時就有cookie了,否則發(fā)送不成功)
h = urllib.request.urlopen(hosturl)
# 構(gòu)造header,一般header至少要包含一下兩項。
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
# 構(gòu)造Post數(shù)據(jù).
postData = {'email': conf.get("login", "email"),
'password': conf.get("login", "password"),
'url': conf.get("login", "url")
}
# 需要給Post數(shù)據(jù)編碼
postData = urllib.parse.urlencode(postData).encode('utf-8')
# 通過urllib2提供的request方法來向指定Url發(fā)送我們構(gòu)造的數(shù)據(jù),并完成登錄過程
request = urllib.request.Request(posturl, postData, headers)
response = urllib.request.urlopen(request)
# 請求接口獲取原始報文數(shù)據(jù)
download_url = conf.get("download", "url")
request = urllib.request.Request(download_url)
response = urllib.request.urlopen(request)
text = response.read()
嚯~就請求倆接口洋洋灑灑這么多行!!
(不過也不排除有更簡單的寫法,畢竟之前是從網(wǎng)上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君更人性化更優(yōu)雅呀~
兩者比較一下,會發(fā)現(xiàn)處理過程基本是一致的,但urllib比requests多了些什么呢?
- 有木有發(fā)現(xiàn)urllib在import的時候就已經(jīng)比requests多好多啊
- 在保存cookie方面,urllib君看起來真是挺費事,但requests的session就非常方便啦
會話對象requests.Session能夠跨請求地保持某些參數(shù),比如cookies,即在同一個Session實例發(fā)出的所有請求都保持同一個cookies,而requests模塊每次會自動處理cookies,這樣就很方便地處理登錄時的cookies問題。在cookies的處理上會話對象一句話可以頂過好幾句urllib模塊下的操作。