概述

Requests是python中一个很Pythonic的HTTP库,用于构建HTTP请求与解析响应

Requests开发哲学

  • Beautiful is better than ugly.(美丽优于丑陋)
  • Explicit is better than implicit.(直白优于含蓄)
  • Simple is better than complex.(简单优于复杂)
  • Complex is better than complicated.(复杂优于繁琐)
  • Readability counts.(可读性很重要)

安装

直接安装

pip install requests

简单上手

导入模块

import requests

发送请求

#get
r = requests.get('http://httpbin.org/get') #post
r = requests.post('http://httpbin.org/post', data = {'key':'value'})

通过requests.get或post方法实际发出一个http请求,返回一个response对象,http://httpbin.org是一个可以测试http请求的网站

处理响应

r.text  #返回响应内容主体,Requests 会自动解码来自服务器的内容

r.content  #返回二进制的响应内容主体

r.json() #处理json的响应内容,返回解码后的dict

构造请求

Requests中requests.get或post这些方法实际都是通过requests.request(method, url, **kwargs)实现的,主要返回response对象,下面主要介绍这个方法的参数

method -- Request对象的请求方法.
url -- 请求的URL.
params -- (可选) 请求的URL查询字符串中要发送的字典或字节.
data -- (可选) 字典或者元组列表[(key, value)] (form-encoded), 字节, 或者文件对象包含在请求主体中发生,主要是post put使用.
json -- (可选) 包含请求主体中的json数据.
headers -- (可选) HTTP首部(请求/通用/实体首部),字典形式.
cookies -- (可选) Dict 或者 CookieJar对象包含在首部cookie字段发送.
files -- (可选) “名称”:类文件对象(或{“名称:file-tuple}”)的字典,用于分段编码上传。 file-tuple可以是2元组(“ filename”,fileobj),3元组(“ filename”,fileobj,“ content_type”)或4元组(“ filename”,fileobj,“ content_type”,custom_headers), 其中,“ content-type”是一个字符串,用于定义给定文件的内容类型,而custom_headers是一个类似dict的对象,其中包含要为该文件添加的其他标题。
auth -- (可选) 用于Basic/Digest/Custom HTTP 认证,元组类型.
timeout (float or tuple) -- (可选)超时时间,在放弃请求之前,等待服务器发送数据的秒数,以浮点数或(连接超时,读取超时)元组为单位.
allow_redirects (bool) -- (可选)布尔值。 启用/禁用GET / OPTIONS / POST / PUT / PATCH / DELETE / HEAD重定向。 默认为True。
proxies -- (可选)字典,代理设置
verify -- (可选)布尔值(在这种情况下,它控制我们是否验证服务器的TLS证书)或字符串(在这种情况下,它必须是要使用的CA捆绑包的路径)。 默认为True。
stream -- (可选) 如果为False,则将立即下载响应内容。
cert -- (可选) 如果为String,则为ssl客户端证书文件(.pem)的路径。 如果是元组,则(“证书”,“密钥”)配对。

GET请求

requests.get(url, params=None, **kwargs)等价于requests.request('get', url, params=None,**kwargs),**kwargs即上面支持的可选参数

payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload) #即向http://httpbin.org/get?key2=value2&key1=value1请求

POST请求

requests.post(url, data=None, json=None, **kwargs)等价于requests.request('post', url, data=None, json=None, **kwargs)**kwargs即上面支持的可选参数

POST提交请求,数据一般是放在HTTP报文主体中,数据编码主要有以下三种方式并在请求首部Content-Type 中指定

  • application/x-www-form-urlencoded :最常见post提交数据的方式,以form表单形式提交数据。
  • application/json :以json串提交数据。
  • multipart/form-data :一般使用来上传文件。
#application/x-www-form-urlencoded,一般form提交

payload = {'key1': 'value1', 'key2': 'value2'}

r = requests.post("http://httpbin.org/post", data=payload)

#application/json,如果使用 json 参数直接传递dict,就会被自动编码等同于json.dumps(payload)。如果使用data参数传递json.dumps(payload),与json参数不同在于前者有Content-Type,后者无

payload = {'key1': 'value1', 'key2': 'value2'}

r = requests.post("http://httpbin.org/post", json=payload)

#multipart/form-data 传文件

url = 'http://httpbin.org/post'

files = {'file': open('report.xls', 'rb')}

r = requests.post(url, files=files)

定制请求头

如果想为请求添加 HTTP 头部,只要简单地传递一个 dict 给 headers 参数就可以了

headers = {'user-agent': 'my-app/0.0.1'}

r = requests.get('http://httpbin.org/get', headers=headers)

注意的是如果headers中包含Cookie会覆盖使用cookies参数时传入的dict

传入Cookie

直接将字典类型的cookies传入到cookies参数即可

cookies = dict(cookies_are='working')

r = requests.get('http://httpbin.org/get',cookies=cookies)

处理响应

requests方法返回一个response对象

响应内容主体

r = requests.get('http://httpbin.org/get')

r.text  #返回响应内容主体,Requests 会自动解码来自服务器的内容

r.content  #返回二进制的响应内容主体

r.json() #处理json的响应内容,返回解码后的dict

注意:有的中文网站使用r.text时,返回的内容为乱码,实际是自动解码错误了,解决办法主要有

#先返回二进制内容,再根据实际的编码解码

r.content.decode("utf-8")

#不知道具体编码形式时,可以使用下面方法自动解码

r.encoding = r.apparent_encoding

r.text

获取响应头部

1.响应头部信息

r.headers

2.获取此响应的原始请求的头部

r.request.headers

响应状态

1.返回状态码

r.status_code

2.响应是400或500类就抛出HTTPError异常

r.raise_for_status()

3返回状态原因

r.reason

响应内容编码

r.encoding     #从HTTP报文header中猜测的响应内容的编码方式

r.apparent_encoding  #从内容中分析响应内容的编码方式(备选编码方式,一般从html<meta>标签中属性charset获取)

需要注意的是

  • r.encoding:如果header中不存在charset,则认为编码是ISO-8859-1
  • r.text根据r.encoding显示网页内容
  • r.apparent_encoding:根据网页内容分析处的编码方式可以看做是r.encoding的备选

其它方法与属性

response对象其它的方法与属性参考,具体可以查看官网地址http://cn.python-requests.org/zh_CN/latest/api.html#requests.Response

  • apparent_encoding:由html chardet属性表示的编码
  • close():关闭连接,一般不用
  • content:二进制内容主体
  • cookies:返回CookieJar对象
  • elapsed:从发送请求到响应到达之间经过的时间
  • encoding:决定.text的编码,从头部获取
  • headers:响应的头部信息,以字典形式
  • history:是一个 Response 对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。主要用在重定向中
  • is_permanent_redirect:如果此响应是重定向的永久版本之一,则为True。
  • is_redirect:如果此响应是自动处理后格式正确的HTTP重定向,则为true
  • links:返回响应的已解析头链接(如果有)。
  • ok:如果status_code小于400,则返回True。
  • request:这个响应的原始request对象
  • url:响应的最终URL

会话对象

有时候可能需要多个请求才能完成任务的情况,比如模拟登录后的请求操作,如果单独用requests去请求的话,就需要将最初的请求响应的cookie或header保存下来并且在后面的请求中都加入,这样比较麻烦。

所以requests提供了个Session对象,用来让你能够跨请求保持某些参数,它也会在同一个 Session 实例发出的所有请求之间保持 cookie,并且向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。

1.跨请求保持一些 cookie

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"}}'

2.属性的合并

s = requests.Session()
s.auth = ('user', 'pass')
s.headers.update({'x-test': 'true'}) # both 'x-test' and 'x-test2' are sent
s.get('http://httpbin.org/headers', headers={'x-test2': 'true'})

注意的是,只有对象属性才能合并,方法层的参数覆盖则会覆盖

s = requests.Session()

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

3.前后文管理器

with requests.Session() as s:
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')

这样就能确保with区块退出后会话能被关闭,即使发生了异常也一样

参考:http://cn.python-requests.org/zh_CN/latest/

Requests库使用总结的更多相关文章

  1. Python爬虫小白入门(二)requests库

    一.前言 为什么要先说Requests库呢,因为这是个功能很强大的网络请求库,可以实现跟浏览器一样发送各种HTTP请求来获取网站的数据.网络上的模块.库.包指的都是同一种东西,所以后文中可能会在不同地 ...

  2. Requests库上传文件时UnicodeDecodeError: 'ascii' codec can't decode byte错误解析

    在使用Request上传文件的时候碰到如下错误提示: 2013-12-20 20:51:09,235 __main__ ERROR 'ascii' codec can't decode byte 0x ...

  3. Requests库的几种请求 - 通过API操作Github

    本文内容来源:https://www.dataquest.io/mission/117/working-with-apis 本文的数据来源:https://en.wikipedia.org/wiki/ ...

  4. python脚本实例002- 利用requests库实现应用登录

    #! /usr/bin/python # coding:utf-8 #导入requests库 import requests #获取会话 s = requests.session() #创建登录数据 ...

  5. 大概看了一天python request源码。写下python requests库发送 get,post请求大概过程。

    python requests库发送请求时,比如get请求,大概过程. 一.发起get请求过程:调用requests.get(url,**kwargs)-->request('get', url ...

  6. python WEB接口自动化测试之requests库详解

    由于web接口自动化测试需要用到python的第三方库--requests库,运用requests库可以模拟发送http请求,再结合unittest测试框架,就能完成web接口自动化测试. 所以笔者今 ...

  7. python爬虫从入门到放弃(四)之 Requests库的基本使用

    什么是Requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库如果你看过上篇文章关于urllib库的使用,你会发现,其 ...

  8. (转)Python爬虫利器一之Requests库的用法

    官方文档 以下内容大多来自于官方文档,本文进行了一些修改和总结.要了解更多可以参考 官方文档 安装 利用 pip 安装 $ pip install requests 或者利用 easy_install ...

  9. python requests库学习笔记(上)

    尊重博客园原创精神,请勿转载! requests库官方使用手册地址:http://www.python-requests.org/en/master/:中文使用手册地址:http://cn.pytho ...

  10. 使用Python的requests库进行接口测试——session对象的妙用

    from:http://blog.csdn.net/liuchunming033/article/details/48131051 在进行接口测试的时候,我们会调用多个接口发出多个请求,在这些请求中有 ...

随机推荐

  1. The Largest Clique UVA - 11324

    题文:https://vjudge.net/problem/UVA-11324 题解: 这个题目首先可以发现,只要是一个强连通分量,要么都选,要么都不选,将点权看成强连通分量的点数,所以这个题目就转化 ...

  2. 基于mosquitto的MQTT客户端实现C语言

    在对MQTT的学习过程中 一下的内容对我提供了帮助 https://www.runoob.com/w3cnote/mqtt-intro.html 对MQTT的入门级介绍 很基础讲解了什么是MQTT h ...

  3. JVM本地方法栈及native方法

    看到虚拟机栈和本地方法栈的区别的时候有点疑惑,因为本地方法栈为虚拟机的Native方法服务.以下转载一篇关于native方法的介绍: http://blog.csdn.net/wike163/arti ...

  4. 1002. 写出这个数 (20)-PAT乙级真题

    读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字.输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式:在一行内输出n的各位数字之和的每一 ...

  5. snkrs web端分析,canvas中的fingerpint

    snkrs web端分析,canvas中的fingerpint 代码如下 (()=>{ const canvas = document.createElement("canvas&qu ...

  6. margin与padding的区别与用法—以及出现bug的解决方法

    margin(外边距) padding(内边距)   一.语法结构 (1)margin-left:10px; 左外边距 (2)margin-right:10px; 右外边距 (3)margin-top ...

  7. Luogu P2297 刷图 DP

    题目背景 loidc,LOI中的传说级哲♂学家,曾经创造一天内入坑maxlongint个弃坑0x7fffffff个的神奇纪录.目前,loidc最喜欢的游戏就是地下城与勇♂士. 题目描述 Loidc是一 ...

  8. json::rapidjson工具

    源码地址: https://github.com/Tencent/rapidjson 可跨平台使用.将 rapidjson-master\include\rapidjson 中的 rapidjson ...

  9. Tomcat源码分析三:Tomcat启动加载过程(一)的源码解析

    Tomcat启动加载过程(一)的源码解析 今天,我将分享用源码的方式讲解Tomcat启动的加载过程,关于Tomcat的架构请参阅<Tomcat源码分析二:先看看Tomcat的整体架构>一文 ...

  10. 基于 HTML5 + WebGL 实现的垃圾分类系统

    前言 垃圾分类,一般是指按一定规定或标准将垃圾分类储存.分类投放和分类搬运,从而转变成公共资源的一系列活动的总称.分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用.垃圾在分类储存阶段属于公众的私 ...