第三方庫Requests 擅長處理那些複雜的HTTP請求,cookie, header等內容,並且支持 Python 2.6—2.7以及3.3—3.7
提供了比python2中urllib,urllib2和python3中urllib.request,urllib.repsonse等模塊更加簡潔方便的API
安裝Requests庫
$ pip install requests
發送請求
Reponse響應對象
Request請求對象
發送數據和提交表單
文件上傳
流式上傳
上傳多個文件
Cookie
超時處理
代理
SSL證書驗證
客戶端證書
流式響應體
CookieJar
會話Session發送請求
>>> r = requests.get("http://www.baidu.com")
構建一個requests.Request對象,收到響應後返回requests.Response對象
傳遞的關鍵字參數可以查看Request對象的構建方法參數
requests.get(url,params=None,**kwargs)
params參數 接受字符串字典提供給URL作爲查詢字符串(query string)
>>> dic= {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.get("http://httpbin.org/get", params=dic)
>>> r.url #查看url
'http://httpbin.org/get?key2=value2&key1=value1'
字典裏值爲None的鍵都不會被添加到 URL 的查詢字符串裏。
可以將一個列表作爲值傳入
>>> dic= {'key1': 'value1', 'key2': ['value2', 'value3']}
>>> r = requests.get('http://httpbin.org/get', params=dic)
>>> r.url
'http://httpbin.org/get?key1=value1&key2=value2&key2=value3'
其他類型的請求方法
requests.put(url, data=None,**kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.patch(url,data=None,**kwargs)
requests.head(url,**kwargs)
requests.delete(url,**kwargs)
requests.Reponse對象
r.url 查看Reponse對象的URL
r.request 返回響應的請求Request對象
r.text 讀取服務器響應的內容,自動解碼來自服務器的內容,
r.encoding 查看響應使用的編碼,同時可以覆蓋該屬性來改變編碼方式
返回的編碼方式爲requests根據響應頭部推測,不要過度依賴此機制,有時gbk編碼會被使用ISO-8859-1編碼來處理
r.content 以字節方式讀取請求響應體,可用於下載圖片視頻等,可以自動解碼gzip和deflate傳輸編碼的響應數據
r.json() 使用requests內置的JSON解碼器解碼
如果解碼失敗會拋出異常,有時即使唱功調用r.json()也並不意味着響應成功
有的服務器會在失敗的響應中包含一個 JSON 對象(比如 HTTP 500 的錯誤細節)。
這種 JSON 會被解碼返回。
要檢查請求是否成功,請使用 r.raise_for_status()或者檢查r.status_code 是否和你的期望相同。
r.raw 獲取來自服務器的原始套接字,請求方法應確保設置stream=True
r.headers 以字典的形式返回服務器響應頭使用任意大小寫來傳遞給索引或get()方法訪問響應頭字段
r.cookies 返回RequestsCookieJar對象,允許以字典方式訪問響應中包含的cookie
r.history 該屬性是一個Response對象的列表,可用來追蹤重定向,對象的順序時按照最老到最近的請求排序
r.status_code 返回響應狀態碼
r.ok 如果響應狀態嗎小於400則返回True
r.raise_for_status() 針對響應碼拋出相應異常
requests.Request對象
requests.request(method, url, **kwargs)
method 爲請求方法http,https等等
url 爲URL地址
params 該參數作爲查詢字符串,字典或者字節流
headers 作爲請求頭的字典,所有的header值必須時string, bytestring unicode
allow_redirects 布爾值,True表示禁用重定向處理,False表示禁用重定向處理
HEAD請求方法默認不使用重定向
auth 接受元組或者HTTPBasicAuth類用於身份驗證
發送數據和提交表單 data參數
提交表單時應注意處理表單的URL,也就是表單字段的action屬性,應該將URL設置爲該action的地址,該地址可能爲絕對地址或相對地址,進行相應的轉換
data 接受字典或包含元組的列表,字節流或文件對象作爲請求體
傳遞字典給data參數,自帶你會自動編碼爲表單形式
元組列表可以在表單多個元素使用同一個key時使用,
還可以JSON編碼的數據作爲參數傳遞
>>> payload = (('key1', 'value1'), ('key1', 'value2'))
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> payload = {'some': 'data'}
>>> r = requests.post(url, data=json.dumps(payload)
其他類型會直接作爲數據發送出去
json 接受字典,並自動編碼爲JSON數據作爲請求體
文件上傳 files參數
files 接受一個字典用於上傳文件
>>> url = 'http://httpbin.org/post'
>>> files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=files)
可以顯示地設置文件名,文件類型和請求頭
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
>>> r = requests.post(url, files=files)
也可以發送作爲文件接受的字符串
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.csv', 'some,data,to,send\nanother,row,to,send\n')}
>>> r = requests.post(url, files=files)
要求使用二進制模式打開文件,因爲Request可能會試圖提供Content-length字段,這個值會被設爲文件的字節數,如果用文本模式打開可能會出錯
流式上傳,可以發送大的數據流或文件,僅需爲請求體data參數提供一個文件對象即可,而無需先把他們讀入內存
with open('massive-body') as f:
requests.post('http://some.url/streamed', data=f)
上傳多個文件,需要把文件放到一個元組的列表中
#<input type="file" name="images" multiple="true" required="true"/>
#上傳多個圖像文件到表單
>>> url = 'http://httpbin.org/post'
>>> multiple_files = [
('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
>>> r = requests.post(url, files=multiple_files)
Cookie cookies參數
大多數網站都是用cookie來跟蹤用戶是否登陸,一旦登陸,就會將服務器生成的令牌,登陸有效期限和狀態跟蹤信息等信息保存在cookie中,網站會把cookie用作信息驗證,當瀏覽網站中每個頁面時都會發送給服務器
但是對於網站比較複雜,會更改調整cookie,或者不想要在代碼中cookie時,可以使用會話Session對象來持續跟蹤會話信息
cookies 接受字典或CookieJar對象
>>> jar = requests.cookies.RequestsCookieJar()
>>> jar.set('tasty_cookie', 'yum', domain='httpbin.org', path='/cookies')
>>> jar.set('gross_cookie', 'blech', domain='httpbin.org', path='/elsewhere')
>>> r = requests.get('http://httpbin.org/cookies', cookies=jar)
超時 timeout參數
爲了防止服務器不能及時響應,大部分發到外部服務器的請求端都應該帶timeout參數
如果沒有顯示指定timeout值,Requests一般不會進行超時處理,代碼可能會阻塞若干分鐘甚至更長時間
超時可分爲連接超時,和讀取超時
連接超時指客戶端實現到遠程機器端口的連接(connect())時的超時時間
讀取超時指客戶端連接到服務器,併發送http請求後,等待服務器發送響應的時間
timeout 該參數設置多少秒後停止等待響應
只針對連接過程有效,與下載響應體的時間無關
可以傳遞一個元組,分別指定connect和read的timeout
r = requests.get('https://github.com', timeout=5)
r = requests.get('https://github.com', timeout=(3.05, 27))
r = requests.get('https://github.com', timeout=None) #設爲None爲永遠等待
代理 proxies參數
proxies 接受一個字典參數來爲任意請求方法配置單個請求
也可以通過環境變量HTTP_PROXY和HTTPS_PROXY來配置代理
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
字典鍵爲請求方法,代理 URL 必須包含連接方式
如果代理需要使用HTTP Basic Auth,可以使用http://user:pasword@host語法
proxies = {
"http": "http://user:[email protected]:3128/",
}
要爲某個特定的連接方式或者主機設置代理,使用 scheme://hostname 作爲 key,它會針對指定的主機和連接方式進行匹配。
proxies = {'http://10.20.1.128': 'http://10.10.1.10:5323'}
SSL證書驗證 verify參數
verify 該參數用於爲HTTPS驗證SSL證書,傳入CA_BUNDLE文件的路徑名,或者可信任CA證書文件的文件加路徑
如果verify設爲文件夾路徑,文件加必須通過OpenSSL提供的c_rehash工具處理
設爲False則表示忽略對SSL證書的驗證,默認爲True
如果認證失敗會引發SSLError
verify僅用於主機證書,私有證書,需要傳遞CA_BUNDLE文件,也可以設置REQUEST_CA_BUNDLE環境變量
客戶端證書 cert參數
cert 指定一個本地證書用於客戶端證書,可以時單個文件(包含密鑰和證書),或者一個包含兩個文件路徑的元組
如果指定了錯誤路徑或無效證書會引發SSLError
本地證書的私有key必須時解密狀態,目前不支持加密的key
流式響應體 stream參數
stream 默認情況下,當進行網絡請求後,響應體會立即被下載,stream參數可以推遲下載響應體,直到訪問Response.content屬性
tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)
此時只有響應頭被下載,連接保持打開狀態,允許我們爲響應頭設置條件來獲取內容
if int(r.headers['content-length']) < TOO_LONG:
content = r.content
...
CookieJar
requests.utils.add_dict_to_cookiejar(cookiejar, cookie_dict)
將cookie_dict字典中數據添加到類型爲CookieJar的cookiejar參數中並返回
request.utils.cookiejar_from_dict(cookie_dict, cookiejar=None,overwrite=True)
將cookie_dict字典中的數據插入到cookiejar對象中,如果overwrite爲False將不更改cookiejar參數對象,而是返回一個新對象
request.cookies.RequestsCookieJar(policy=None) 構造一個RequestsCookieJar對象
RequestsCookieJar對象可以按照字典方式操作,並有一些其他的方法
cj.get(name, default=None)
cj.get_dict() 返回字典形式
cj.set(name,value)
cj.update()
cj.clear_session_cookies() 清除會話cookie
會話Session
會話對象可以爲請求保持某些參數,他也會在同一個Session實例發出的所有請求之間保持COOKIE
如果向同一主機發送多個請求,底層TCP連接將會被重用
requests.Session會話對象擁有主要的Requests API的所有方法
>>> s = requests.Session()
>>> s.get('http://httpbin.org/get')
使用上下文管理器,這樣就可以確保with代碼塊退出後即使發生一出場會話也能被關閉>>> with requests.Session() as s:
>>> s.get('http://httpbin.org/get')
會話可以爲請求方法提供缺省數據,任何傳遞給請求方法的字典都會與設置會話層數據合併,並且方法層的參數可以覆蓋會話層的數據
不過就算使用了會話,方法層的參數不會被跨域請求保持
s = requests.Session()
#只會和第一個請求發送方法傳遞的cookie
r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
# '{"cookies": {"from-my": "browser"}}'
r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {}}'
如果手動爲會話添加cookie,則使用Cookie utility函數來操作Session.cookies