1 HTTP协议
2 HTTP协议与Requests库的一致性
3 安装 requests
- pip install requests
4 请求参数
- url: 获取页面的url链接
- params: 增加到url中的参数,字典或字节序列
1 # -*- encoding: utf-8 -*- 2 import requests 3 4 kv = {'k1':'v1', 'k2':'v2'} 5 resp = requests.get('https://www.baidu.com', params=kv) 6 print resp.url 7 8 #结果 9 https://www.baidu.com/?k2=v2&k1=v1
- data:向服务器提交资源,字典、字节序列或文件对象
1 # -*- encoding: utf-8 -*- 2 import requests 3 #用例1 4 kv = {'k1':'v1', 'k2':'v2'} 5 resp = requests.post('https://www.baidu.com', data=kv) 6 #用例2 7 data = '提交字符串' 8 resp = requests.post('https://www.baidu.com', data=data)
- json:向服务器提交json格式的数据
1 # -*- encoding: utf-8 -*- 2 import requests 3 4 kv = {'k1':'v1', 'k2':'v2'} 5 resp = requests.post('https://www.baidu.com', json=kv)
- headers:定制请求的协议头,字典
1 # -*- encoding: utf-8 -*- 2 import requests 3 4 hd = {'user-agent':'Chrome/10'} 5 resp = requests.post('https://www.baidu.com', headers=hd)
- cookies:请求中添加cookie,字典或CookieJar
- auth:支持HTTP认证功能,元组
- files:向服务器传输文件,字典
1 # -*- encoding: utf-8 -*- 2 import requests 3 4 fs = {'file':open('data.xls','rb')} 5 resp = requests.post('https://www.baidu.com', files=fs)
- timeout:请求超时时间,秒
1 # -*- encoding: utf-8 -*- 2 import requests 3 4 resp = requests.get('https://www.baidu.com', timeout=10)
- proxies:设定访问代理服务器,可以增加登录认证,字典,防止爬虫被反追踪
1 # -*- encoding: utf-8 -*- 2 import requests 3 4 pxs = {'http':'http://user:password@1.1.1.1:1234', 'https':'https://1.1.1.1:5678'} 5 resp = requests.get('https://www.baidu.com', proxies=pxs)
- allow_redirects:重定向开关,True/False,默认True
- stream:是否对获取内容立即下载,True/False,默认True
- verify:SSL证书认证,True/False,默认True
- cert:本地SSL证书路径
5 响应内容
type(resp) #响应对象 resp.status_code #状态码 resp.text #响应内容的字符串形式 resp.content #响应内容的二进制形式 resp.encoding #从header中猜测的响应内容编码方式 resp.apparent_encoding #从内容中分析出来的响应内容编码方式
6 异常处理
requests.ConnectionError #网络连接错误异常,如DNS查询失败、拒绝连接等 requests.HTTPError #HTTP错误异常 requests.URLRequired #url缺失异常 requests.TooManyRedirects #超过最大重定向次数 requests.ConnectTimeout #连接远程服务器超时 reqeusts.Timeout #请求URL超时 resp.raise_for_status() #如果状态码不是200,引发requests.HTTPError
7 函数封装
1 def getHTMLText(url): 2 try: 3 resp = requests.get(url, timeout=30) 4 resp.raise_for_status() 5 resp.encoding = resp.apparent_encoding 6 return resp.text 7 except: 8 return '产生异常' 9 if __name__ == '__main__': 10 url = 'http://www.baidu.com' 11 print getHTMLText(url)
8 与单元测试框架结合
- 脚本
1 # -*- encoding: utf-8 -*- 2 import requests 3 import unittest2 4 import HTMLTestRunner 5 import time 6 import sys 7 8 reload(sys) 9 sys.setdefaultencoding('utf8') 10 11 class BaiduTest(unittest2.TestCase): 12 '''测试百度接口''' 13 def testNoParam(self): 14 '''没有参数''' 15 #返回response 对象,可以从这个对象中找到我们想要的信息 16 resp = requests.get('https://www.baidu.com') 17 self.assertEqual(resp.status_code, 200) 18 19 if __name__ == '__main__': 20 #组织用例 21 suite = unittest2.TestSuite() 22 suite.addTest(BaiduTest('testNoParam')) 23 # 报告准备 24 reportName = time.strftime('%Y%m%d%H%M%S') # 文件名 25 fp = open('../reports/' + reportName + '.html', 'wb') # 文件路径 26 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, # 定义报告 27 title='test reporter', 28 description='interface test reporter Demo') 29 # 执行测试 30 runner.run(suite) 31 #关闭文件 32 fp.close()
- 结果
2