当前位置: 移动技术网 > IT编程>脚本编程>Python > Python requests库用法实例详解

Python requests库用法实例详解

2018年08月18日  | 移动技术网IT编程  | 我要评论

伞乐活,交通标志大全图解,岩节连

本文实例讲述了python requests库用法。分享给大家供大家参考,具体如下:

requests是python中一个第三方库,基于 urllib,采用 apache2 licensed 开源协议的 http 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 http 测试需求。接下来将记录一下requests的使用:

安装

要使用requests库必须先要安装:

pip install requests

创建请求

通过requests库发出一个请求非常简单,首先我们先导入requests库:

import requests

现在我们尝试创建一个请求,用来获取百度的网页信息:

result = requests.get('http://www.baidu.com/')

现在我们获取到了一个response对象result,我们可以从这个对象中获得所有我们需要的所有信息。刚刚的栗子是使用的get请求,接下来将使用requests库进行post请求:

result = requests.post('http://www.baidu.com/',data={key:value})

很简单对吧?那么其他http请求呢:put、delete、head和options呢?

result = requests.put('http://www.baidu.com/',data={key,value})
result = requests.head('http://www.baidu.com/')
result = requests.delete('http://www.baidu.com/')
result = requests.options('http://www.baidu.com/')

在url中传递参数

你经常想要在url的查询字符串中发送某种数据。如果你手动构建网址,那么这个数据会在问号后作为网址中的键值对,例如https://www.baidu.com/s?wd=requests。请求允许你使用params关键字参数将这些参数作为字符串字典提供。举个栗子,你想传递name=zhangsan并且age=18到https://www.baidu.com/s,你可以这样写:

data = {"name":"zhangsan","age":18}
result = requests.get("https://www.baidu.com/s",params=data)

此时我们打印一下url,发现该url已经被正确编码:

print result.url # https://www.baidu.com/s?name=zhangsan&age=18

也可以传递一个列表进去:

data = {"name":"zhangsan","favorite":["football","basketball"]}
result = requests.get("https://www.baidu.com/s",params=data)
print result.url # https://www.baidu.com/s?name=zhangsan&favorite=football&favorite=basketball

响应内容

在上面的例子可以知道,我们每次请求之后都会返回一个对象,我们可以从此对象中获取响应内容:

result = requests.get("https://api.github.com/events")
print result.text    # [{"id":"6924608641","type":"pushevent",...}]

二进制响应内容

print result.content  # b'[{"id":"6924656608","type":"createevent",...}]'

json格式的响应内容,如果解码失败,result.json()将会引发异常

print result.json()     # [{"id":"6924608641","type":"pushevent",...}]

请求将自动解码来自服务器的内容。大多数unicode字符集都是无缝解码的。我们也可以根据如下方法获取当前的编码:

print result.encoding

如果响应的内容并不是你想要的编码格式,你可以在调用result.text之前,对result.encoding进行赋值,给予新的编码格式。

要检查一个请求是否成功,使用result.raise_for_status()或者result.status_code来检查是否你期望的

套接字响应

在极少数情况下,你希望从服务器中获得是原始套接字响应,你可以通过result.raw来获取。如果你想这样做,确保你设置stream=true在你的初始请求。一旦你这样操作了,你可以这样:

result = requests.get("https://api.github.com/events",stream=true)
print result.raw        # <urllib3.response.httpresponse object at 0x10ce52dd8>
print result.raw.read(10)    # b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03'

通常情况下,我们使用如下这种模式来保存正在流式传输的内容:

with open("info.txt","wb") as f:
  for item in result.iter_content(chunk_size=128):
    f.write(item)

自定义头部

如果你想将自定义请求头添加到请求当中,只需要传递一个字典到headers参数即可。例如,在请求中指定我们的请求代理:

header = {"user-agent":'my_test/0001'}
result = requests.get("https://api.github.com/events",headers=header)

注意,请求头的值必须是一个字符串,byte类型的字符串或者unicode。虽然允许unicode,但还是避免使用unicode

复杂的post请求

通常情况下,你想要发送一些表单编码数据,就像html表单一样。要做到这一点,你只需要将字典传递给data参数即可:

infodict = {"name":"张三"}
result = requests.post('http://127.0.0.1:5000/test/post',data=infodict)

你也可以传递一个元组数据:

tupleinfo = ("name","张三")
result = requests.post('http://127.0.0.1:5000/test/post',data=tupleinfo)

有时你需要发送一些非编码格式的数据,即你发送的是一个string而不是dict,那么数据将会直接发送:

import json
infodict = {"name":"张三"}
result = requests.post('http://127.0.0.1:5000/test/post',data=json.dumps(infodict))

如果你想要发送一个字典数据,你可以通过它使用json参数,它会自动编码:

infodict = {"name":"张三"}
result = requests.post('http://127.0.0.1:5000/test/post',json=infodict)

注意,如果你传递了data参数或者files,那么json将会被忽略

post上传文件

requests上传文件其实很简单:

with open('info.txt','rb') as f:
  result = requests.post('http://localhost:5000/post',files={"files":f})

响应状态码

我们执行完一个请求之后,我们可以使用如下方法查看状态码,检测请求是否成功:

result = requests.get('http://localhost:5000/get')
print result.status_code  # 200

当返回200,表示请求执行成功,我们还可以使用如下方法判断请求是否成功,true为成功,false不成功:

print result.staatus_code == requests.codes.ok    # true

当我们执行一个错误的请求(4xx客户端错误,5xx服务器错误)时,我们可以以下方法来抛出异常进行检车:

result = requests.get('http://localhost:5000/get')
print result.status_code      # 404
print result.raise_for_status()   # traceback (most recent call last): ...

但是如果我们的请求是执行成功的,即状态码为200,此时raise_for_status()的值将会是none

响应头

我们可以使用python字典来查看服务器的响应头文件:

print result.headers    # {'content-type': 'text/html; charset=utf-8', 'content-length': '2', 'server': 'werkzeug/0.12.2 python/2.7.10', 'date': 'sun, 03 dec 2017 14:15:32 gmt'}

cookies

如果响应包含了cookie,你可以这样快速的访问它:

result = requests.get('http://localhost:5000/get')
print result.cookies['username']

或者你需要将自己的cookie发送给服务器,你可以使用cookies参数:

cookie = {'username':'zhangsan'}
result = requests.get('http://localhost:5000/get',cookies=cookie)

requestcookiejar提供了一个完整的接口,适合在多个域和路径中使用,它将返回一个cookie,所以它也可以被传入到cookies参数中

c = requests.cookies.requestscookiejar()
c.set('username','zhangsan',domain='http://localhost:5000',path='/get')
result = requests.get('http://localhost:5000/get',cookies=c)

session对象

session对象允许你在请求中保存某些参数,它将在所有由会话实例创建的请求中保存cookie,并将使用urllib3连接池。如果你想同一主机发出多个请求,则会重新使用底层的tcp连接,这将使性能显著提高。session具有主api的所有请求方法:

s = requests.session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'

但是请注意,方法级参数不会保存在请求,即使使用一个session。这个栗子只会发送第一个请求的cookie,不会发送第二个:

result = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(result.text)
# '{"cookies": {"from-my": "browser"}}'
result = s.get('http://httpbin.org/cookies')
print(result.text)
# '{"cookies": {}}'

请求和响应对象

每当你发起一个get请求,你都在做两件事。首先,构造一个request将被发送到服务器的对象来请求或查询某个资源。其次,response一旦从服务器中获得响应,就会生成一个对象。该response对象包含服务器锁返回的所有信息,并且还包含request你最初创建的对象。这是一个简单的请求,从维基百科的服务器获取一些非常重要的信息:

result = requests.get('http://en.wikipedia.org/wiki/monty_python')

现在我们需要获取服务器发送给我们的头文件信息:

print result.headers

如果我们需要获取发送给服务器的头文件信息,我们可以这样:

print result.request.headers

ssl证书验证

请求将验证https请求的ssl证书,就像web浏览器一样。默认情况下,启用ssl验证,如果无法验证ssl证书,将会引发sslerror:

result = reqests.get('https://kyfw.12306.cn/otn/login/init')
# requests.exceptions.sslerror: ("bad handshake: error([('ssl routines', 'tls_process_server_certificate', 'certificate verify failed')],)",)

为了避免出现这个错误,我们可以将ca证书的ca_bundle文件或目录传递给verify参数里面:

result = reqests.get('https://kyfw.12306.cn/otn/login/init',verify='/path/...')

或者使用session方式存储起来:

s = session()
s.verify='/path/...'
result = s.get('https://kyfw.12306.cn/otn/login/init')

如果将verify参数设置为false,请求也可以忽略ssl证书:

result = requests.get('https://kyfw.12306.cn/otn/login/init',verify=false)

更多关于python相关内容可查看本站专题:《python socket编程技巧总结》、《python数据结构与算法教程》、《python函数使用技巧总结》、《python字符串操作技巧汇总》、《python入门与进阶经典教程》及《python文件与目录操作技巧汇总

希望本文所述对大家python程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网