Requests

python的request库官方介绍就是让HTTP服务人类,所以从这点我们就可以知道request库是为了让我们更加方便的进行http相关的各种操作

我们学习request有什么用呢?

1)web时代我们需要熟悉掌握web交互原理

2)爬虫

3)服务器编程

4)自动化测试

实验环境准备

首先是环境的准备,首先我们肯定要装requests库 直接使用pip命令即可(注意:本文使用的是py3.6版本)

同时我们需要一个服务器来测试我们的各种操作,我们可以直接使用requests库作者写的一个网站 httpbin.org 来进行我们的各种实验操作

requests例程

我们可以从下面的简单的例程来简单了解下requests

import requests

#实验web地址 http://httpbin.org

url_ip='http://httpbin.org/ip'

url_get='http://httpbin.org/get'

#直接使用

def requests_simple():

#利用get方法得到一个response

response1=requests.get(url_ip)

#打印头部headders

print('Response Headers:',response1.headers)

#打印Body

print('Response Body:',response1.text)

#带参数的请求

def requests_params():

params_test={'param1':'hello','param2':'world'}

#发送请求

response2=requests.get(url_get,params=params_test)

#处理响应

#打印头部headders

print('Response Headers:', response2.headers)

#打印Status Code

print('Response Status Code',response2.status_code)

# 打印Body 上面用到的是text 我们可以直接使用 .json()方法得到js格式

print('Response Body:', response2.json())

if __name__=='__main__':

print('___________requests_simple方法____________')

requests_simple()

print('___________requests_params方法____________')

requests_params()

看下输出结果:

___________requests_simple方法____________

Response Headers: {'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json', 'Date': 'Tue, 13 Aug 2019 08:21:40 GMT', 'Referrer-Policy': 'no-referrer-when-downgrade', 'Server': 'nginx', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'Content-Length': '56', 'Connection': 'keep-alive'}

Response Body: {

"origin": "115.51.238.17, 115.51.238.17"

}

___________requests_params方法____________

Response Headers: {'Access-Control-Allow-Credentials': 'true', 'Access-Control-Allow-Origin': '*', 'Content-Encoding': 'gzip', 'Content-Type': 'application/json', 'Date': 'Tue, 13 Aug 2019 08:21:41 GMT', 'Referrer-Policy': 'no-referrer-when-downgrade', 'Server': 'nginx', 'X-Content-Type-Options': 'nosniff', 'X-Frame-Options': 'DENY', 'X-XSS-Protection': '1; mode=block', 'Content-Length': '215', 'Connection': 'keep-alive'}

Response Status Code 200

Response Body: {'args': {'param1': 'hello', 'param2': 'world'}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.18.4'}, 'origin': '115.51.238.17, 115.51.238.17', 'url': 'https://httpbin.org/get?param1=hello&param2=world'}

程序中每一步都有详细注解,就不再赘述

Requests发送请求

请求方法:

GET:    查看资源

POST:    增加资源

PUT:    修改资源

PATCH:   更新资源

DELETE:  删除资源

HEAD:   查看响应头

OPTIONS:  查看可用请求方法

我们先来看下github上对于http请求方法的解释

例程 使用github api接口查看某个用户的公开信息

如图中最后一行显示,我们可以使用 GET /users/:username 来获取信息 下面为代码:

import requests

import json

url='https://api.github.com'

#构建url函数 我们需要提交的url是原api网址加上我们自己额外添加的参数

# 所以简单写一个组成url的函数 即添加 '/' 号

def build_url(conend):

return '/'.join([url,conend])

#更好的显示返回json的打印参数

#我们从网页得到的json可以使用下面函数来更好的print

def better_jsprint(json_str):

return json.dumps(json.loads(json_str),indent=4)

#主体函数 get请求得到回应 例如我们查看用户名为Test的公开资料

def requests_method():

response=requests.get(build_url('users/Test'))

print(better_jsprint(response.text))

if __name__=="__main__":

requests_method()

结果返回:

{

"login": "test",

"id": 383316,

"node_id": "MDQ6VXNlcjM4MzMxNg==",

"avatar_url": "https://avatars3.githubusercontent.com/u/383316?v=4",

"gravatar_id": "",

"url": "https://api.github.com/users/test",

"html_url": "https://github.com/test",

"followers_url": "https://api.github.com/users/test/followers",

"following_url": "https://api.github.com/users/test/following{/other_user}",

"gists_url": "https://api.github.com/users/test/gists{/gist_id}",

"starred_url": "https://api.github.com/users/test/starred{/owner}{/repo}",

"subscriptions_url": "https://api.github.com/users/test/subscriptions",

"organizations_url": "https://api.github.com/users/test/orgs",

"repos_url": "https://api.github.com/users/test/repos",

"events_url": "https://api.github.com/users/test/events{/privacy}",

"received_events_url": "https://api.github.com/users/test/received_events",

"type": "User",

"site_admin": false,

"name": null,

"company": null,

"blog": "",

"location": null,

"email": null,

"hireable": null,

"bio": null,

"public_repos": 5,

"public_gists": 0,

"followers": 23,

"following": 0,

"created_at": "2010-09-01T10:39:12Z",

"updated_at": "2019-02-13T02:44:23Z"

}

这样我们就得到了名称为Test的用户的公开信息了

同样的我们也可以使用githubapi文档中的其他方法进行测试

带参数的请求

首先来看常用的带参数请求的三种方法

params参数请求例程:

还是使用github的api接口 这次我们使用下面这个提供的请求方法

可以看到该方法中需要传入 params参数 下面是程序代码:

import requests

import json

url='https://api.github.com'

#构建url函数 我们需要提交的url是原api网址加上我们自己额外添加的参数

# 所以简单写一个组成url的函数 即添加 '/' 号

def build_url(conend):

return '/'.join([url,conend])

#更好的显示返回json的打印参数

#我们从网页得到的json可以使用下面函数来更好的print

def better_jsprint(json_str):

return json.dumps(json.loads(json_str),indent=4)

#主体函数 添加params参数来进行请求

def requests_params():

response=requests.get(build_url('users'),params={'since':11})

#打印返回信息

print (better_jsprint(response.text))

#查看具体的url地址

print (response.url)

if __name__=="__main__":

requests_params()

返回结果很长就不再展示 只展示下此请求的url地址为 https://api.github.com/users?since=11

json参数请求例程

例程1 我们使用api中更新用户信息的方法来测试json参数请求

下面为代码:

import requests

import json

url='https://api.github.com'

#构建url函数 我们需要提交的url是原api网址加上我们自己额外添加的参数

# 所以简单写一个组成url的函数 即添加 '/' 号

def build_url(conend):

return '/'.join([url,conend])

#更好的显示返回json的打印参数

#我们从网页得到的json可以使用下面函数来更好的print

def better_jsprint(json_str):

return json.dumps(json.loads(json_str),indent=4)

#主体函数 添加json参数来进行请求 下面代码中的auth用来账户认证 即自己的账户密码

def requests_json():

response=requests.patch(build_url('user'),auth=('此处为你的账户','此处为你的密码'),json={'name':'此处为你想要改的名字'})

#打印返回信息

print (better_jsprint(response.text))

#查看具体的url地址

print (response.url)

if __name__=="__main__":

requests_json()

运行代码之后 我们可以打开github主页查看自己的账户名称是否改变

例程2 使用post json参数请求添加一个email地址

代码展示:

import requests

import json

url='https://api.github.com'

#构建url函数 我们需要提交的url是原api网址加上我们自己额外添加的参数

# 所以简单写一个组成url的函数 即添加 '/' 号

def build_url(conend):

return '/'.join([url,conend])

#更好的显示返回json的打印参数

#我们从网页得到的json可以使用下面函数来更好的print

def better_jsprint(json_str):

return json.dumps(json.loads(json_str),indent=4)

#主体函数 添加json参数来进行请求 代码中的auth参数为认证信息 即自己的github账户密码 json参数传入要添加的email地址

def requests_json():

response=requests.post(build_url('user/emails'),auth=('账户','密码'),json=['test@qq.com'])

#打印返回信息

print (better_jsprint(response.text))

#查看具体的url地址

print (response.url)

if __name__=="__main__":

requests_json()

返回内容:

[

{

"email": "1231231230@qq.com",

"primary": true,

"verified": true,

"visibility": "private"

},

{

"email": "32220+H3213@users.noreply.github.com",

"primary": false,

"verified": true,

"visibility": null

},

{

"email": "test@qq.com",

"primary": false,

"verified": false,

"visibility": null

}

]

https://api.github.com/user/emails

至此 我们已经完成了使用json参数进行请求

请求异常处理

我们都知道在互联网上经常会出现很多错误,比如超时,更比如404之类的,当我们写的程序遇到请求异常该如何处理呢?

我们以超时(Timeout)和HTTPERR为例写出一个例程来分析:

首先错误都在requests包中的exceptions中 所以我们要引用:

from requests import exceptions

再例如对于timeout的设置有两种方法:

requests.get(url,timeout=(3,7))

requests.get(url,timeout=10)

区别是什么呢? 我们都知道访问一个网站是我们发送一个请求,然后网站给予我们一个响应,所以第一种方法中的3和7分别对应这两个过程的超时时间限制,

第二种则是整个访问过程的时间限制

timeout例程:

import requests

import json

from requests import exceptions

url='https://api.github.com'

#构建url函数 我们需要提交的url是原api网址加上我们自己额外添加的参数

# 所以简单写一个组成url的函数 即添加 '/' 号

def build_url(conend):

return '/'.join([url,conend])

#更好的显示返回json的打印参数

#我们从网页得到的json可以使用下面函数来更好的print

def better_jsprint(json_str):

return json.dumps(json.loads(json_str),indent=4)

#主体函数 添加timeout参数限制访问时间,使用try except来捕获错误并打印

def requests_err():

try:

response=requests.get(build_url('user/emails'),timeout=0.1)

except exceptions.Timeout as err:

print(err)

if __name__=="__main__":

requests_err()

返回值:

HTTPSConnectionPool(host='api.github.com', port=443): Max retries exceeded with url: /user/emails (Caused by ConnectTimeoutError(, 'Connection to api.github.com timed out. (connect timeout=0.1)'))

httperror例程:

httperror例程中我们可以显式抛出状态值statuscode然后捕获

import requests

import json

from requests import exceptions

url='https://api.github.com'

#构建url函数 我们需要提交的url是原api网址加上我们自己额外添加的参数

# 所以简单写一个组成url的函数 即添加 '/' 号

def build_url(conend):

return '/'.join([url,conend])

#更好的显示返回json的打印参数

#我们从网页得到的json可以使用下面函数来更好的print

def better_jsprint(json_str):

return json.dumps(json.loads(json_str),indent=4)

#主体函数 下列代码中并未添加认证信息,所以状态值不为200,我们需要raise出状态值然后捕获

def requests_err():

try:

response=requests.get(build_url('user/emails'))

response.raise_for_status()

except exceptions.HTTPError as err:

print(err)

if __name__=="__main__":

requests_err()

返回值:

401 Client Error: Unauthorized for url: https://api.github.com/user/emails

定制请求

我们可以自定义构造一些信息然后向目标网址发送来实现某些功能 比如爬虫之类的 下面举简单的修改头部信息

例程:

import requests

#主体函数 在代码中添加头部信息来向目标网址发送自己定制请求

def requests_header():

response=requests.get('http://httpbin.org/get',headers={'User-Agent':'fake'})

print(response.text)

if __name__=="__main__":

requests_header()

看看返回信息:(http://httpbin.org/get 会返回我们的信息)

{

"args": {},

"headers": {

"Accept": "*/*",

"Accept-Encoding": "gzip, deflate",

"Host": "httpbin.org",

"User-Agent": "fake"

},

"origin": "115.51.238.17, 115.51.238.17",

"url": "https://httpbin.org/get"

}

注意看我们的头部信息已经完成修改

响应的处理

# 响应的常用属性

response.text # 响应回去的文本(字符串)

response.content # 响应回去的内容(二进制),一般用来爬取视频

response.status_code # 响应的状态码

response.url # 获取请求连接地址

response.cookies # 获取返回的cookies信息

response.cookies.get_dict() # 获取返回的cookies信息

response.request # 获取请求方式

response.headers # 查看响应头

response.history # 重定向历史 即前一次请求的地址

# 返回结果为json数据处理

response.json() # 将结果进行反序列化

# 爬取文档乱码问题

response.apparent_encoding # 文档的编码的方式(从HTML文档找)

response.encoding # 响应体编码方式

eg: response.encoding = response.apparent_encoding # 文档的声明方式

eg: print(response.text.encode('utf-8'))

注意:response.headers是服务器发送给我们的头部信息,response.request.headers才是我们这个客服端向服务器发请求的头部信息(即自己的信息)

下载文件

例如我们现在去网络下载一张图片,只不过现在我们使用requests库来完成

简单的下载例程如下:

importrequests

url='https://www.baidu.com/img/bd_logo1.png'

defdownload_img():

response=requests.get(url)

with open('logo.png','wb') as img:#此步骤涉及文件读写操作图片是二进制,所以要用二进制写文件 用参数 'wb'

img.write(response.content)if __name__=='__main__':

download_img()

然后会发现当前目录下出现了 logo.png的图片 此时已经下载成功

需要注意的是 有时候文件很大,我们需要以数据流的方式读写,否则可能造成内存溢出问题,

当下载大的文件的时候,我们可以在requests.get()中使用stream参数.

默认情况下是false,他会立即开始下载文件并存放到内存当中,倘若文件过大就会导致内存不足的情况.

当把get函数的stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载。需要注意一点:文件没有下载之前,它也需要保持连接。

iter_content:一块一块的遍历要下载的内容

iter_lines:一行一行的遍历要下载的内容

使用上面两个函数下载大文件可以防止占用过多的内存,因为每次只下载小部分数据。

例程:

importrequests

url='https://www.baidu.com/img/bd_logo1.png'

defdownload_img():

response=requests.get(url,stream=True)#stream参数记得选为True

with open('logo.png','wb') as img:#图片是二进制,所以要用二进制写文件 用参数 'wb'

for chunk in response.iter_content(1024):#规定一次读取写入大小 单位为字节

img.write(chunk)

response.close()#关闭数据流连接

if __name__=='__main__':

download_img()

有时候会被服务器禁止请求,原因可能是user-agent未更改,这就相当于简单的反爬虫了,所以一般我们写爬虫的时候需要修改user-agent信息,这些问题在讲解爬虫时会讲

简单总结流程就是:

浏览器模拟(修改headers)-->构建request-->读取数据-->写入数据

身份认证

auth

前面已经讲过,我们可以传入 auth 参数来将自己的账号密码传入目标网址来进行身份验证,可是这种方式是安全的吗?

例如:

importrequests

url='https://api.github.com'

#构建url函数 我们需要提交的url是原api网址加上我们自己额外添加的参数#所以简单写一个组成url的函数 即添加 '/' 号

defbuild_url(conend):return '/'.join([url,conend])#基础身份认证

defhttp_auth():

response=requests.get(build_url('user'),auth=('test','test123'))#看下我们的请求的头部数据

print(response.request.headers)

http_auth()

我们再看下返回头部数据:

{'User-Agent': 'python-requests/2.18.4', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic dGVzdDp0ZXN0MTIz'}

我们发现里面含有 'Authorization': 'Basic dGVzdDp0ZXN0MTIz' 一段 那这个会是我们的账号密码吗? 我们使用解码来看下

importbase64print(base64.b64decode('dGVzdDp0ZXN0MTIz'))

输出:

b'test:test123'

发现还真的是我们的账号密码,所以这样也不是很安全

因此现在广泛使用更安全的Oauth认证

OAuth

oauth是Open Authorization的简写,oauth协议为用户资源的授权提供了一个安全的、开放而又建议的标准。第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此oauth是安全的。

最最简单的例子就是 现在我们登录多个网站(例如微博,网盘等)应用可以直接选择QQ快速登录,这就是OAuth认证,它无需你输入账户密码即可认证

下面我们还是用github的api来做一个简单的oauth认证

然后我们就得到了一串神秘代码如下图

接下来我们开始写简单的例程:

importrequests

url='https://api.github.com'

#构建url函数 我们需要提交的url是原api网址加上我们自己额外添加的参数#所以简单写一个组成url的函数 即添加 '/' 号

defbuild_url(conend):return '/'.join([url,conend])#基础oauth认证

defhttp_oauth():#构建头部数据 加上token信息

header={'Authorization':'token 62646e55689b597eb076cb08c5e020e3762bc84f'}

response=requests.get(build_url('user'),headers=header)print(response.text)

http_oauth()

运行发现登录成功 虽然这是个个人身份令牌 但是oauth原理也是如此

Cookie 和 Session

Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。

这样做的好处就是cookie的体积变小,只存储session-id信息类似于上面讲的token,并且session信息存储在服务器端也比较安全

至此,requests库的学习就先告一段落,但是哦我们还有更多高阶操作可以去学习。

python requests是什么_python requests库学习相关推荐

  1. python绘制蚊香形_Python requests发送post请求的一些疑点

    前言 在Python爬虫中,使用requests发送请求,访问指定网站,是常见的做法.一般是发送GET请求或者POST请求,对于GET请求没有什么好说的,而发送POST请求,有很多朋友不是很清楚,主要 ...

  2. python requests 代理超时_python requests 超时与重试

    一 源起: requests模块作为python爬虫方向的基础模块实际上在日常实际工作中也会涉及到,比如用requests向对方接口url发送POST请求进行推送数据,使用GET请求拉取数据. 但是这 ...

  3. python xlwings 切片_Python xlwings库学习笔记(1)

    Python xlwings库学习笔记(1) Python是最近几年很火的编程语言,被办公自动化的宣传吸引入坑,办公自动化必然绕不开Excel的操作,能操作Excel的库有很多,例如: xlrd xl ...

  4. 工信部python证书多少钱_python requests SSL证书问题

    错误信息如下: requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'tls_process_ser ...

  5. python 图形库有哪些_python常用库有哪些

    今天将介绍20个常用工具的Python库,我相信你看完之后也会觉得离不开它们. 它们是:(推荐学习:Python视频教程) Requests.Kenneth Reitz写的最富盛名的http库.每个P ...

  6. python爬豆瓣电视剧_python requests库爬取豆瓣电视剧数据并保存到本地详解

    首先要做的就是去豆瓣网找对应的接口,这里就不赘述了,谷歌浏览器抓包即可,然后要做的就是分析返回的json数据的结构: https://movie.douban.com/j/search_subject ...

  7. python构造响应头_Python爬虫库requests获取响应内容、响应状态码、响应头

    首先在程序中引入Requests模块 import requests 一.获取不同类型的响应内容 在发送请求后,服务器会返回一个响应内容,而且requests通常会自动解码响应内容 1.文本响应内容 ...

  8. python requests超时时间_python - requests 库 使用过程中timeout值最大可设值?

    问 题 请问 requests 库 使用过程中timeout错误的默认时间是多长呢? 查看源码 理论上 timeout值可以任意设? 默认 timeout 值 是怎么来的呢? 如果我想设一个比较大的t ...

  9. python requests 状态码_Python爬虫库requests获取响应内容、响应状态码、响应头

    更多python教程请到: 菜鸟教程www.piaodoo.com 人人影视www.sfkyty.com 16影视www.591319.com 星辰影院www.591319.com 首先在程序中引入R ...

最新文章

  1. vs项目移植到linux运行,VS2008项目移植到Linux
  2. Resteasy集成Spring
  3. 安卓手机复制文件到电脑
  4. AIX本地磁盘io优化
  5. LLC算法coding与pooling解析
  6. mongoose设置unique不生效问题解决
  7. notepad++每行首尾添加内容
  8. html博客源码_5分钟搭建私人Java博客系统——Tale
  9. 记一次有意思的种树比赛
  10. mongodb运算操作符
  11. vscode开发环境
  12. Koa-router 优先级问题
  13. JSON转Model内部实现解析
  14. navicat中文破解版,navicat for mysql10.0.11简体中文破解版
  15. 数学建模番外篇2:作图练习-美赛2020E题
  16. 【 BlockChain 】零知识证明
  17. H5+CSS 实现前面带搜索图标的搜索框
  18. mediapipe系列之一脸部特征点标记
  19. okvis 基于关键帧视觉惯性传感器非线性优化SLAM 论文翻译+博客总结
  20. DNS 智能解析功能评测之国内部分总结篇~

热门文章

  1. 中国特种电缆市场市场需求预测及竞争战略研究报告2021年版
  2. dreamweaver php 动态教程,利用DreamweaverCS5制作一个含有动态标题的教程
  3. python电路仿真_Python创建PWL用于SPICE仿真
  4. 幸福就是把爱留给爱你的人
  5. 评分卡模型验证常用指标
  6. R语言中文分词包jiebaR
  7. php 实现图形验证码,PHP实现图形验证码案例(1)
  8. PlantUML绘制类图
  9. Navicat Mac版本集合
  10. Android Loader(加载器)详解