requests高级用法
會話對象
當你向同一主機發送多個請求時,session會重用底層的tcp連接,從而提升性能,同時session也會為所有請求保持 cookie。
#!/usr/bin/env python # -*- coding:utf-8 -*- # __author__:kzg import requestss = requests.Session() # 此地址cookie為空 r = s.get('http://httpbin.org/cookies') print(r.text) 結果: {"cookies": {} }session可以保持cookie來訪問后續同一服務器上的地址
#!/usr/bin/env python # -*- coding:utf-8 -*- # __author__:kzg import requestss = requests.Session() r = s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') print(r.text) # cookie被保持來訪問此url rc = s.get('http://httpbin.org/cookies') print(rc.text)結果: {"cookies": {"sessioncookie": "123456789"} }{"cookies": {"sessioncookie": "123456789"} }
可以修改session的屬性(cookies,headers)來為請求方法(get,post)提供缺省數據,可保跨請求保持。
?
# -*- coding:utf-8 -*- # __author__:kzg import requests # 生成session對象 s = requests.Session() print(s.headers) # 修改session屬性 s.headers.update({'User-Agent':'kong'}) print(s.headers) r = s.get('http://httpbin.org/headers') print(r.text) 結果: {'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.18.1'} {'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'kong'} {"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Host": "httpbin.org", "User-Agent": "kong"} }也可以通過傳遞方法層的參數來提供缺省數據,它會與已設置的會話層數據合并,不能跨請求保持。
# -*- coding:utf-8 -*- # __author__:kzg import requests # 生成session對象 s = requests.Session() # 修改session屬性 s.headers.update({'User-Agent':'kong'}) # 方法級參數cookies r = s.get('http://httpbin.org/headers',cookies={'from-my': 'browser'}) print(r.text) # 方法級參數不能被保持到下一個請求 r1 = s.get('http://httpbin.org/headers') print(r1.text) 結果: {"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Cookie": "from-my=browser", "Host": "httpbin.org", "User-Agent": "kong"} }{"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "close", "Host": "httpbin.org", "User-Agent": "kong"} }
請求與響應對象
你任何時間調用requests.*()的時候,都是在做兩件重要的事情。
1、你在構建request對象,并把它發送到某服務器去請求或查詢一些資源
2、產生response對象來接收從服務器返回的所有響應,也包含你創建的request對象
# _*_ coding: utf-8 _*_ import requests# 生成一個會話對象 s = requests.Session()r = requests.get('http://en.wikipedia.org/wiki/Monty_Python') # 服務器返回來的頭部信息 print r.headers # 發送給服務器的頭部信息 print r.request.headers
工作流響應體內容
如果你在請求中使用了stream=True:
1、僅有響應體會被立即下載,只有當訪問response.content屬性時響應體才會被下載
2、此時連接保持打開狀態,需要調用response.close來關閉連接
3、連接效率低下
# _*_ coding: utf-8 _*_ import requeststarball_url = 'https://github.com/kennethreitz/requests/tarball/master' r = requests.get(tarball_url, stream=True) print r.headers['content-length']結果:
3336071
文件上傳
#!/usr/bin/python3 # -*- coding: utf-8 -*- import requestsurl = 'http://httpbin.org/post' files = {'file': open('D:\\projects\\blog\\my_temp.xlsx', 'rb')} ret = requests.post(url, files=files) print(ret.text)
設置文件名、文件類型和請求頭
#!/usr/bin/python3 # -*- coding: utf-8 -*- import requestsurl = 'http://httpbin.org/post' files = {'file': ('my_temp.xlsx',open('D:\\projects\\blog\\my_temp.xlsx', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} ret = requests.post(url, files=files) print(ret.text)
? 流式上傳
允許你在請求中發送大的數據流或文件,此時requests會根據文件大小來設置headers中的content-length,所以文件最好以二進制方式打開
with open('massive-body','rb') as f:requests.post('http://some.url/streamed', data=f)
為請求設置代理
如果需要為請求設置代理,只需要給相應的請求提供proxies參數即可。
方法一、
$ export HTTP_PROXY="http://10.10.1.10:3128" $ export HTTPS_PROXY="http://10.10.1.10:1080" $ python >>> import requests >>> requests.get("http://example.org")方法二、
# _*_ coding: utf-8 _*_ import requestsproxies={"http":"http://10.10.1.10:3128","https":"http://10.10.1.10:1080", }r = requests.get("http://example.org",proxies=proxies)
超時
為防止服務器不能及時響應,大部分發至外部服務器的請求都應該帶著 timeout 參數
# _*_ coding: utf-8 _*_ import requests# 同時設置connect,read的timeout r = requests.get('https://github.com', timeout=5) # 分別設置connect和read的timeout r = requests.get('https://github.com', timeout=(3.05, 27)) # 永久等待,直到讀完 r = requests.get('https://github.com', timeout=None)
?
轉載于:https://www.cnblogs.com/kongzhagen/p/6236491.html
總結
以上是生活随笔為你收集整理的requests高级用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 广汽集团捐赠 1000 万驰援各受灾地区
- 下一篇: 英特尔酷睿 Ultra 1 代处理器爆料