Python之requests详解
Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。更重要的一点是它支持 Python3 哦!
- Beautiful is better than ugly.(美丽优于丑陋)
- Explicit is better than implicit.(清楚优于含糊)
- Simple is better than complex.(简单优于复杂)
- Complex is better than complicated.(复杂优于繁琐)
- Readability counts.(重要的是可读性)
安装 Requests
通过pip安装
pip install requests
或者,下载代码后安装:
$ git clone git://github.com/kennethreitz/requests.git $ cd requests $ python setup.py install
再懒一点,通过IDE安装吧,如pycharm!
请求
基本GET请求
import requests response = requests.get("http://httpbin.org/get") print(response.text)
带参数GET请求
import requests response = requests.get("http://httpbin.org/get?name='abc'&age=23") print(response.text)
import requests data = { 'name':'abc', 'age': 23 } response = requests.get("http://httpbin.org/get",params=data) print(response.text)
添加headers
import requests headers = { 'User-Agent':'Mozilla/5.0(Windows NT 10.0; Win64; x64; rv:62.0)Gecko/20100101 Firefox/62.0' } response = requests.get('https://www.zhihu.com/explore',headers=headers) print(response.status_code)
各种请求方式
requests.get(‘https://github.com/timeline.json’) #GET请求
requests.post(“http://httpbin.org/post”) #POST请求
requests.put(“http://httpbin.org/put”) #PUT请求
requests.delete(“http://httpbin.org/delete”) #DELETE请求
requests.head(“http://httpbin.org/get”) #HEAD请求
requests.options(“http://httpbin.org/get”) #OPTIONS请求
基本POST请求
import requests headers = { 'User-Agent':'Mozilla/5.0(Windows NT 10.0; Win64; x64; rv:62.0)Gecko/20100101 Firefox/62.0' } data = {'name':'张三','age':'22'} response = requests.post("http://httpbin.org/post",data=data,headers=headers) print(response.text)
POST发送JSON数据:
import requests,json response = requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some': 'data'})) print(response.json())
文件上传
import requests url = 'http://127.0.0.1:5000/upload' files = {'file': open('01.jpg', 'rb')} # files = {'file': ('01.jpg', open('01.jpg', 'rb'))} #显式的设置文件名 response = requests.post(url, files=files) print(response.text)
更加方便的是,你可以把字符串当着文件进行上传:
import requests url = 'http://127.0.0.1:5000/upload' files = {'file': ('test.txt', b'Hello Requests.')} # 必需显式的设置文件名 response = requests.post(url, files=files) print(response.text)
响应
response属性
response = requests.get('http://www.baidu.com') print(type(response.status_code),response.status_code) print(type(response.headers),response.headers) print(type(response.cookies),response.cookies) print(type(response.url),response.url) print(type(response.history),response.history)
其他响应:
response.status_code #响应状态码
response.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
response.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
response.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
response.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
#*特殊方法*#
response.json() #Requests中内置的JSON解码器
response.request.headers #返回请求头
response.raise_for_status() #失败请求(非200响应)抛出异常
获取请求头和响应头
import requests response = requests.get('http://www.zhidaow.com') print(response.headers['Content-Type']) print(response.headers.get('content-type')) print(response.request.headers) print(response.request.headers['User-Agent'])
解析json
import requests,json response = requests.get("http://httpbin.org/get") print(response.json()) print(json.loads(response.text)) print(type(response.text),type(response.json()))
解析二进制文件
import requests,json response = requests.get("https://github.com/favicom.ico") print(type(response.text),type(response.content)) print(response.text) print(response.content) with open('favicom.ico','wb') as f: f.write(response.content)
高级操作
获取cookie
import requests response = requests.get('http://www.baidu.com') print(response.cookies) print(response.cookies['content-type']) for key,value in response.cookies: print(key + "=" + value)
要想发送你的cookies到服务器,可以使用 cookies 参数:
import requests url = 'http://httpbin.org/cookies' cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'} # 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。 response = requests.get(url, cookies=cookies) print(r.json())
会话维持(常用于模拟登录)
相当与两个浏览器发送请求,cookie不能共享
import requests requests.get("http://httpbin.org/cookies/set/number/232423") response = requests.get('http://httpbin.org/cookies') print(response.text)
import requests session = requests.Session() session.get("http://httpbin.org/cookies/set/number/232423") response = session.get('http://httpbin.org/cookies') print(response.text)
证书验证
12306网站,使用的不是官方的证书验证,会导致SSL错误
import requests response = requests.get('https://www.12306.cn') print(response.status_code)
urllib3.disable_warnings():关闭警告
verify=False:关闭证书认证
import requests from requests.packages import urllib3 urllib3.disable_warnings() response = requests.get('https://www.12306.cn',verify=False) print(response.status_code)
指定本地证书进行认证
import requests response = requests.get('https://www.12306.cn',cart=('/path/server.crt','/path/key')) print(response.status_code)
代理设置
import requests proxies = { "http":'http://127.0.0.1:5465', "https":'https://127.0.0.1:5465', } response = requests.get('https://www.taobao.com',proxies=proxies) print(response.status_code)
当代理需要认证时
import requests proxies = { "http":'http://user:password@127.0.0.1:5465', } response = requests.get('https://www.taobao.com',proxies=proxies) print(response.status_code)
socks代理
#pip3 install "requests[socks]" import requests proxies = { "http":'socks5://127.0.0.1:5465', "https":'socks5://127.0.0.1:5465', } response = requests.get('https://www.taobao.com',proxies=proxies) print(response.status_code)
超时设置
import requests from requests.exceptions import ReadTimeout,ConnectTimeout try: response = requests.get('https://httpbin.org/get',timeout=0.5) print(response.status_code) except ReadTimeout: print("Read Timeout") except ConnectTimeout: print("Connect Timeout")
认证设置
import requests from requests.auth import HTTPBasicAuth r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd')) # r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd')) # 简写 print(r.json())
另一种非常流行的HTTP身份认证形式是摘要式身份认证,Requests对它的支持也是开箱即可用的:
requests.get(URL, auth=HTTPDigestAuth('user', 'pass'))
后记
 1、官方文档
requests的具体安装过程请看:http://docs.python-requests.org/en/latest/user/install.html#install
requests的官方指南文档:http://docs.python-requests.org/en/latest/user/quickstart.html
requests的高级指南文档:http://docs.python-requests.org/en/latest/user/advanced.html#advanced
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号