python requests
一、Requests发送HTTP请求 案例:选定某个测试的URL,利用requests库内置的不同的方法来发送不同类型(GET/POST/PUT/DELETE)的http请求,并输出响应的状态码
request basic.py # 导入requests库 import requests ? # 定义base_url作为基础被测URL base_url = ‘http://httpbin.org‘ ? # 发送get请求;打印响应状态码 r = requests.get(base_url+‘/get‘) print(r.status_code) ? # 发送POST请求;打印响应状态码 r = requests.post(base_url+‘/post‘) print(r.status_code) ? # 发送PUT请求;打印响应状态码 r = requests.put(base_url+‘/put‘) print(r.status_code) ? # 发送DELETE请求,打印响应状态码 r = requests.delete(base_url+‘/delete‘) print(r.status_code) 执行结果: ? ? 二、Requests参数传递 1.传递URL参数 案例:利用Requests库,在GET请求中使用查询字符串(Query String)传递参数。 # 导入requests库 import requests ? # 定义base_url作为基础被测URL base_url = ‘http://httpbin.org‘ ? # 定义请求所需的参数,参数之间以英文逗号隔开 param_data = {‘uname‘:‘Test00001‘,‘pwd‘:‘123456‘} # 发送GET请求,格式如:requests.get(url,params) r = requests.get(base_url+‘/get‘,params=param_data) print(r.url)??? # 输出请求的url print(r.status_code)??? #输出响应的状态码 执行结果: ? 2.传递Body参数 案例:利用Requests库,在POST请求的请求体(Request Body)中传递参数 import requests base_url = ‘http://httpbin.org‘ ? form_data = {‘uname‘:‘Test00002‘,‘pwd‘:‘123456‘} # 发送POST请求,格式如:requests.post(url,data) r = requests.post(base_url+‘/post‘,data=form_data) print(r.text)?? # 返回响应内容 执行结果: ? 三、Requests请求头设置 1.设置Request Headers 案例:利用Requests库,为POST请求添加HTTP Headers,此时需要传递一个字典类型的数据给headers参数 import requests ? base_url = ‘http://httpbin.org‘ ? form_data = {‘uname‘:‘Test00003‘,‘pwd‘:‘123456‘} header = {‘user-agent‘:‘Mozilla/5.0‘} r = requests.post(base_url+‘/post‘,data=form_data,headers=header) print(r.text)? #以文本形式返回响应内容 执行结果: ? print(r.text)代表以文本形式返回响应内容 若以上代码修改为print(r.json()),代表以json形式返回响应内容,如下: ? 2.Request Headers爬虫应用 爬虫程序通过定制Request Headers来模拟浏览器的访问行为,以应对网站的反爬虫策略,避免被封。 如:爬取知乎页面元素时,需要设置与浏览器一致的请求头,然后再发送请求 情形1:不设置Request Headers import requests r = requests.get(‘https://www.zhihu.com/explore‘) print(r.text) 执行结果: ? 情形2:设置Request Headers (从浏览器Copy一份User-Agent作为设置的Headers) ? import requests header = {‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/63.0.3239.132 Safari/537.36‘} r = requests.get(‘https://www.zhihu.com/explore‘,headers=header) print(r.text) 执行结果: ? ? 四、Requests Cookies设置 1.设置Cookies 通过cookies参数可以设置Cookie request advanced.py import requests ? base_url = ‘http://httpbin.org‘ ? cookie = {‘uid‘:‘666‘} r =requests.get(base_url+‘/cookies‘,cookies=cookie) print(r.text) 执行结果: ? 2.获取Cookies 首页对某个站点发起请求,然后获取其Cookies(通过调用cookies属性即可获取所请求站点的cookies) r = requests.get(‘http://www.baidu.com‘) print(r.cookies) print(type(r.cookies)) ? for key,value in r.cookies.items(): ??? print(key+‘:‘+value) 执行结果: ? 从以上输出结果中可以观察到: ? 五、Requests超时设置 & 文件上传 1.超时设置 将timeout作为参数项,若响应超过设置的时间后即停止等待响应,以防某些请求没有响应而一直处于等待状态 import requests ? base_url = ‘http://httpbin.org‘ ? cookie = {‘uid‘:‘666‘} r = requests.get(base_url+‘/cookies‘,cookies=cookie) print(r.text) print(r.elapsed.total_seconds())??? # 获取响应时间(s) ? 2)设置等待响应的超时时间 cookie = {‘uid‘:‘666‘} r = requests.get(base_url+‘/cookies‘,cookies=cookie,timeout=0.5) print(r.text) 执行结果:(连接超时,抛出异常) 2.文件上传 Requests利用files作为参数模拟提交文件数据 file = {‘file‘:open(‘test.bmp‘,‘rb‘)}?? #rb表示用二进制格式打开指定目录下的文件,且用于只读 r =requests.post(base_url+‘/post‘,files=file) print(r.text) 执行结果: ? ? 六、Session会话对象 会话(Session):Session对象存储特定用户会话所需的属性及配置信息。当用户在应用程序的Web页面之间跳转时,存储在Session对象中的变量将在整个用户会话过程中一直存在,以确保在不同页面中操作的是同一个用户。 在接口测试过程中接口之间经常有依赖关系,如某个接口中的数值传递到另外一个接口作为参数传递使用。 案例:A请求是设置 Cookie,B请求是获取Cookie。若没有Session保存机制的情况下,B接口是没法获取到A接口设置的Cookie值。 # 设置Cookies。{name}/{value}分别设置Cookie的名称和值 http://www.httpbin.org/cookies/set/{name}/{value} # 获取Cookies http://www.httpbin.org/cookies ? 场景①:未启用Session保存机制 执行代码: # A接口设置Cookie r = requests.get(base_url+‘/cookies/set/uid/666‘) print(r.text) ? print(‘--------------------‘) ? # B接口获取Cookie r = requests.get(base_url+‘/cookies‘) print(r.text) 执行结果: ? 场景②:启用Session保存机制 Requests的会话对象能够跨请求保持某些参数,也会在同一个Session实例发出的所有请求之间保持cookie一致。 执行代码: # 生成会话对象 s = requests.session() ? # 利用会话对象调用接口A并设置cookie r = s.get(base_url+‘/cookies/set/uid/666‘) print(r.text) ? print(‘--------------------‘) ? # 利用同一会话对象调用接口B并获取cookie r = s.get(base_url+‘/cookies‘) print(r.text) 执行结果: ? ? 七、SSL验证 & 代理设置 1.SSL证书验证 Requests可以模拟Web浏览器,实现对HTTPS请求来验证SSL证书。SSL验证默认是开启的,若证书验证失败,Requests会抛出SSLError;若不想验证SSL则可以使用verify参数(verify=False)关闭验证SSL。 以验证12306网站的证书为例,如下: 1)保持默认开启SSL证书验证,发送请求 import requests r = requests.get(‘https://www.12306.cn‘) print(r.text) 执行结果: 2)利用verify参数关闭验证SSL import requests r = requests.get(‘https://www.12306.cn‘,verify=False) print(r.text) 执行结果: ? 2.代理设置 代理(Proxy):网络代理是一种特殊的网络服务,允许一个网络终端(客户端)通过代理服务与另一个网络终端(服务器)进行非直接的连接。代理服务器位于客户端和服务端之间,代理服务器接收客户端的请求,然后代替客户端向目标网站发出请求,所有的流量路由均来自代理服务器的IP地址,从而实现获取一些不能直接获取的资源。 测试过程中,有的接口在请求少量次数时,可正常获取内容。但若大量频繁请求(如:性能测试场景),服务器可能会开启验证,甚至直接把IP封禁。为了防止以上情况影响正常测试,此时就需要设置代理来解决。在Requests中需要用到proxies参数,在爬虫时也会常用到代理设置。 测试过程中所需的代理IP,可参考:西刺免费代理IP 选取某个代理IP进行测试: ? 执行代码: proxy = {‘http‘:‘118.190.95.35:9001‘} r = requests.get(base_url+‘/get‘,proxies=proxy) print(r.text) 执行结果: ? 以上返回结果中,origin参数即为请求时所设置的代理IP(若不设置代理IP,则origin显示为所用测试机的IP) ? 八、身份认证 身份认证:很多接口都需要身份认证,Requests支持多种身份认证,如:BasicAuth、DigestAuth... ? 执行代码: import requests from requests.auth import HTTPBasicAuth from requests.auth import HTTPDigestAuth ? base_url = ‘http://httpbin.org‘ ? # BasicAuth认证 r = requests.get(base_url+‘/basic-auth/test00001/222221‘,auth=HTTPBasicAuth(‘test00001‘,‘222221‘)) print(r.text) ? print(‘------------------‘) ? # DigestAuth认证 r = requests.get(base_url+‘/digest-auth/auth/test00002/222222‘,auth=HTTPDigestAuth(‘test00002‘,‘222222‘)) print(r.text) 执行结果: ? ? 九、流式请求 流式请求:有的接口返回值包含有多个结果,而非常规的返回一个结果。比如查询接口,其返回值为排在前面固定数量的多个结果。 案例 ? n表示返回结果集的数量,比如输入10则会返回10个不同id的结果,如下: r = requests.get(base_url+‘/stream/10‘) print(r.text) ? 针对此类型接口,对结果集的处理需要使用iter_lines()迭代方法来处理。如下: ? 执行代码: import requests import? json ? # 发送流式请求,stream=True表示接受流式请求,返回多个结果 r = requests.get(base_url+‘/stream/10‘,stream=True) ? # 若响应内容未设置编码格式,则将其设置为utf-8格式 if r.encoding is None: ??? r.encoding = ‘utf-8‘ ? # 对响应结果进行迭代处理每一组数据(一次一行) for line in r.iter_lines(decode_unicode=True):? # unicode解码方式 ??? if line: ??????? data = json.loads(line) # 将响应的json数据转换为python数据(字典类型) ??????? print(data[‘id‘])?? #输出每个结果(字典类型)中id键对应的值 执行结果: ? PS: 原文:https://www.jianshu.com/p/6a44eca9841d (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |