Requests
上一篇 / 下一篇 2016-11-19 20:42:58 / 个人分类:python
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安装
pipinstallrequests
或者,下载代码后安装:
$ git clone git://github.com/kennethreitz/requests.git$ cd requests $ python setup.pyinstall
再懒一点,通过IDE安装吧,如pycharm!
二、发送请求与传递参数
先来一个简单的例子吧!让你了解下其威力:
importrequests r= requests.get(url='http://www.itwhy.org')#最基本的GET请求print(r.status_code)#获取返回状态r = requests.get(url='http://dict.baidu.com/s', params={'wd':'python'})#带参数的GET请求print(r.url)print(r.text)#打印解码后的返回数据
很简单吧!不但GET方法简单,其他方法都是统一的接口样式哦!
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请求
PS:以上的HTTP方法,对于WEB系统一般只支持 GET 和 POST,有一些还支持 HEAD 方法。
带参数的请求实例:
importrequests requests.get('http://www.dict.baidu.com/s', params={'wd':'python'})#GET参数实例requests.post('http://www.itwhy.org/wp-comments-post.php', data={'comment':'测试POST'})#POST参数实例
POST发送JSON数据:
importrequestsimportjson r= requests.post('https://api.github.com/some/endpoint', data=json.dumps({'some':'data'}))print(r.json())
定制header:
importrequestsimportjson data= {'some':'data'} headers= {'content-type':'application/json','User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'} r= requests.post('https://api.github.com/some/endpoint', data=data, headers=headers)print(r.text)
三、Response对象
使用requests方法后,会返回一个response对象,其存储了服务器响应的内容,如上实例中已经提到的 r.text、r.status_code……
获取文本方式的响应体实例:当你访问 r.text 之时,会使用其响应的文本编码进行解码,并且你可以修改其编码让 r.text 使用自定义的编码进行解码。
r = requests.get('http://www.itwhy.org')print(r.text,'\n{}\n'.format('*'*79), r.encoding) r.encoding='GBK'print(r.text,'\n{}\n'.format('*'*79), r.encoding)
其他响应:
r.status_code #响应状态码
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
#*特殊方法*#
r.json() #Requests中内置的JSON解码器
r.raise_for_status() #失败请求(非200响应)抛出异常
案例之一:
importrequests URL='http://ip.taobao.com/service/getIpInfo.php'#淘宝IP地址库APItry: r= requests.get(URL, params={'ip':'8.8.8.8'}, timeout=1) r.raise_for_status()#如果响应状态码不是 200,就主动抛出异常exceptrequests.RequestException as e:print(e)else: result=r.json()print(type(result), result, sep='\n')
四、上传文件
使用 Requests 模块,上传文件也是如此简单的,文件的类型会自动进行处理:
importrequests url='http://127.0.0.1:5000/upload'files= {'file': open('/home/lyb/sjzl.mpg','rb')}#files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))} #显式的设置文件名r= requests.post(url, files=files)print(r.text)
更加方便的是,你可以把字符串当着文件进行上传:
importrequests url='http://127.0.0.1:5000/upload'files= {'file': ('test.txt', b'Hello Requests.')}#必需显式的设置文件名r= requests.post(url, files=files)print(r.text)
五、身份验证
基本身份认证(HTTP Basic Auth):
importrequestsfromrequests.authimportHTTPBasicAuth 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'))
六、Cookies与会话对象
如果某个响应中包含一些Cookie,你可以快速访问它们:
importrequests r= requests.get('http://www.google.com.hk/')print(r.cookies['NID'])print(tuple(r.cookies))
要想发送你的cookies到服务器,可以使用 cookies 参数:
importrequests url='http://httpbin.org/cookies'cookies= {'testCookies_1':'Hello_Python3','testCookies_2':'Hello_Requests'}#在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。r = requests.get(url, cookies=cookies)print(r.json())
会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。
下面就来一个真正的实例,如下是快盘签到脚本:
importrequests headers= {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Encoding':'gzip, deflate, compress','Accept-Language':'en-us;q=0.5,en;q=0.3','Cache-Control':'max-age=0','Connection':'keep-alive','User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'} s=requests.Session() s.headers.update(headers)#s.auth = ('superuser', '123')s.get('https://www.kuaipan.cn/account_login.htm') _URL='http://www.kuaipan.cn/index.php's.post(_URL, params={'ac':'account','op':'login'}, data={'username':'****@foxmail.com','userpwd':'********','isajax':'yes'}) r= s.get(_URL, params={'ac':'zone','op':'taskdetail'})print(r.json()) s.get(_URL, params={'ac':'common','op':'usersign'})
七、超时与异常
timeout 仅对连接过程有效,与响应体的下载无关。
>>> requests.get('http://github.com', timeout=0.001) Traceback (most recent call last): File"<stdin>", line 1,in<module>requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
所有Requests显式抛出的异常都继承自 requests.exceptions.RequestException:ConnectionError、HTTPError、Timeout、TooManyRedirects。
转自:http://www.itwhy.org/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/python/python-%E7%AC%AC%E4%B8%89%E6%96%B9-http-%E5%BA%93-requests-%E5%AD%A6%E4%B9%A0.html
requests是python的一个HTTP客户端库,跟urllib,urllib2类似,那为什么要用requests而不用urllib2呢?官方文档中是这样说明的:
python的标准库urllib2提供了大部分需要的HTTP功能,但是API太逆天了,一个简单的功能就需要一大堆代码。
我也看了下requests的文档,确实很简单,适合我这种懒人。下面就是一些简单指南。
插播个好消息!刚看到requests有了中文翻译版,建议英文不好的看看,内容也比我的博客好多了,具体链接是:http://cn.python-requests.org/en/latest/(不过是v1.1.0版,另抱歉,之前贴错链接了)。
1. 安装
安装很简单,我是win系统,就在这里下载了安装包(网页中download the zipball处链接),然后$ python setup.py install
就装好了。
当然,有easy_install
或pip
的朋友可以直接使用:easy_install requests
或者pip install requests
来安装。
至于Linux用户,这个页面还有其他安装方法。
测试:在IDLE中输入import requests
,如果没提示错误,那说明已经安装成功了!
2. 小试牛刀
>>>importrequests>>>r=requests.get('http://www.zhidaow.com')# 发送请求>>>r.status_code# 返回码200>>>r.headers['content-type']# 返回头部信息'text/html; charset=utf8'>>>r.encoding# 编码信息'utf-8'>>>r.text#内容部分(PS,由于编码问题,建议这里使用r.content)u'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...'...
是不是很简单?比urllib2和urllib简单直观的多?!那请接着看快速指南吧。
3. 快速指南
3.1 发送请求
发送请求很简单的,首先要导入requests模块:
>>>importrequests
接下来让我们获取一个网页,例如我个人博客的首页:
>>>r=requests.get('http://www.zhidaow.com')
接下来,我们就可以使用这个r
的各种方法和函数了。
另外,HTTP请求还有很多类型,比如POST,PUT,DELETE,HEAD,OPTIONS。也都可以用同样的方式实现:
>>>r=requests.post("http://httpbin.org/post")>>>r=requests.put("http://httpbin.org/put")>>>r=requests.delete("http://httpbin.org/delete")>>>r=requests.head("http://httpbin.org/get")>>>r=requests.options("http://httpbin.org/get")
因为目前我还没用到这些,所以没有深入研究。
3.2 在URLs中传递参数
有时候我们需要在URL中传递参数,比如在采集百度搜索结果时,我们wd参数(搜索词)和rn参数(搜素结果数量),你可以手工组成URL,requests也提供了一种看起来很NB的方法:
>>>payload={'wd':'张亚楠','rn':'100'}>>>r=requests.get("http://www.baidu.com/s",params=payload)>>>printr.urlu'http://www.baidu.com/s?rn=100&wd=%E5%BC%A0%E4%BA%9A%E6%A5%A0'
上面wd=
的乱码就是“张亚楠”的转码形式。(好像参数按照首字母进行了排序。)
3.3 获取响应内容
可以通过r.text
来获取网页的内容。
>>>r=requests.get('https://www.zhidaow.com')>>>r.textu'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...'
文档里说,requests会自动将内容转码。大多数unicode字体都会无缝转码。但我在cygwin下使用时老是出现UnicodeEncodeError
错误,郁闷。倒是在python的IDLE中完全正常。
另外,还可以通过r.content
来获取页面内容。
>>>r=requests.get('https://www.zhidaow.com')>>>r.contentb'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml"...'
文档中说r.content
是以字节的方式去显示,所以在IDLE中以b
开头。但我在cygwin中用起来并没有,下载网页正好。所以就替代了urllib2的urllib2.urlopen(url).read()
功能。(基本上是我用的最多的一个功能。)
3.4 获取网页编码
可以使用r.encoding
来获取网页编码。
>>>r=requests.get('http://www.zhidaow.com')>>>r.encoding'utf-8'
当你发送请求时,requests会根据HTTP头部来猜测网页编码,当你使用r.text
时,requests就会使用这个编码。当然你还可以修改requests的编码形式。
>>>r=requests.get('http://www.zhidaow.com')>>>r.encoding'utf-8'>>>r.encoding='ISO-8859-1'
像上面的例子,对encoding修改后就直接会用修改后的编码去获取网页内容。
3.5 json
像urllib和urllib2,如果用到json,就要引入新模块,如json
和simplejson
,但在requests中已经有了内置的函数,r.json()
。就拿查询IP的API来说:
>>>r=requests.get('http://ip.taobao.com/service/getIpInfo.php?ip=122.88.60.28')>>>r.json()['data']['country']'中国'
3.6 网页状态码
我们可以用r.status_code
来检查网页的状态码。
>>>r=requests.get('http://www.mengtiankong.com')>>>r.status_code200>>>r=requests.
TAG:
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | ||||||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 30 | 31 |
我的存档
数据统计
- 访问量: 333330
- 日志数: 236
- 文件数: 1
- 建立时间: 2015-06-02
- 更新时间: 2017-08-07
清空Cookie - 联系我们 - 51Testing软件测试网 - 交流论坛 - 空间列表 - 站点存档 - 升级自己的空间
Powered by 51Testing
© 2003-2021
沪ICP备05003035号