1.requests库的使用
requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的:
“python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码。”
1. 安装
https://pypi.python.org/pypi/requests
api:http://cn.python-requests.org/zh_CN/latest/
pip install requests
2.import requests
3.发送请求
requests.get('http://www.baidu.com')
配置url参数
params 关键字参数,以一个字典来提供这些参数
payload = {'key1': 'value1', 'key2': 'value2'}
requests.get("http://httpbin.org/get", params=payload)
requests.post(url)
表单提交
data传入字典
payload = {'key1': 'value1', 'key2': 'value2'}
requests.post("http://httpbin.org/post", data=payload)
x-www-form-urlencoded形式
headers增加配置 Content-Type:application/x-www-form-urlencoded
data传入字典
raw(文本)提交
字符串形式\xml形式
payload = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" '
r = requests.post(url, data=payload)
json形式
方式一:字典转字符串
payload = {'some': 'data'}
r = requests.post(url, data=json.dumps(payload))
payload = {'some': 'data'}
r = requests.post(url, json=payload)
二进制形式(文件)提交
files参数
files = {'file': open('report.xls', 'rb')}
requests.post(url, files=files)
定制请求头
headers 字典
url = 'https://api.github.com/some/endpoint'
headers = {'user-agent': 'my-app/0.0.1'}
requests.get(url, headers=headers)
添加Cookie
cookies 字典
cookies = dict(cookies_are='working')
cookies ={'cookies_are':'working'}
requests.get(url, cookies=cookies)
超时
requests.get('http://github.com', timeout=0.001)
timeout 仅对连接过程有效,与响应体的下载无关
超时则抛出requests.exceptions.Timeout
4.接收请求
requests的get和post方法返回值都是Response对象,其存储了服务器响应的内容
响应状态码:response.status_code
response.raise_for_status() #失败请求(非200响应)抛出异常
响应头:response.headers--字典
Cookie: response.cookies--字典
响应体:response.text
内容编码格式问题
Requests 会基于 HTTP 响应头对响应的编码作出有根据的推测
response.encoding = 'utf-8' 指定编码格式,之后再调用response.text显示的编码格式就是设置后的
响应中的字节内容(二进制):response.content
解析响应
1.json格式
response.json() --响应字符串转json对象(字典)
2.xml格式
python解析xml方式
使用ElementTree
1.加载xml--加载XML文件共有2种方法,一是加载指定字符串,二是加载指定文件
root = ElementTree.fromstring(text)
root = ElementTree.parse("D:/test.xml")
2.获取对象
find方法 (支持部分xpath语法)
findall方法 (支持部分xpath语法)
注意命名空间:节点tag名称之前添加 {xxxx}
3.获取值、属性
.text
.attrib['category']
4.添加命名空间
2.完成天气预报两个接口的脚本编写
getSupportCityString01
getSupportCityString02
3.单元测试框架的使用
三个概念
Test Case
一个测试用例就是一个完整的测试单元,包含初始和收尾工作
基本单元为函数
Test Suite
一个功能往往有多个测试用例验证,用例的集合称为测试套件
Test Runner
测试用例执行的基本单元
用例组织
方式一:函数是用例,集中在一个类中
继承unittest.TestCase
每个用例都是一个无参的成员方法
方法名为test开头
名为runTest
主函数中调用unitest.main()函数 运行类中以test开头的所有测试用例
方式二:构造测试集合
unittest.TestSuite()
.addTest(类名("方法名"))
类需要事先import
unittest.TextTestRunner().run(suite)
创建run.py
断言使用
用例执行结果2
成功 没有未处理的异常 and 一个或多个断言全部成功
失败 抛出任何未知的或未捕获的异常 or 至少一个断言失败
unittest的原始断言
unittest.TestCase类的成员方法
assertEqual(a, b)判断a==b
assertNotEqual(a, b)判断a!=b
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b)a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)