1 背景

http请求是常见的一种网页协议,我们看到的各种网页,其实都是发送了http请求得到了服务器的响应,从而将数据库中复杂的数据以简单、直观的方式呈现出来,方便大众阅读、使用。而如何发送http请求呢?今天来探讨一下使用requests模块,达到高效、简单的http请求操作。

2 什么是requests

requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,虽然标准库中的urllib2模块已经包含了平时我们使用的大多数功能,但是urllib2的API使用起来并不太友好,而requests自称“HTTP for Humans”,经过高度封装以后,可以直接调用此库的相关函数,非常方便帮助我们实现爬取HTML网页页面、模拟自动提交网络请求等操作。

requests模块一直在迭代更新,以完全适应当前的所有网络请求。

支持的 HTTP 特性:

  • 保持活动和连接池
  • 国际域名和 URL
  • Cookie 持久性会话
  • 浏览器式 SSL 验证
  • 自动内容解码
  • 基本 / 摘要身份验证
  • 优雅的键 / 值 Cookie
  • 自动减压
  • Unicode 响应机构
  • HTTP(S)代理支持
  • 分段文件上传
  • 流下载
  • 连接超时
  • 分块请求
  • .netrc 支持
  • 线程安全

3 如何安装

安装requests模块与安装其他python模块一样,使用pip命令安装即可。

pip install requests
# 如需指定版本
pip install requests==2.27.1

4 如何使用

4.1 七个主要方法

4.2 HTTP协议对资源的操作

4.3 响应公共方法

4.4 常用方式举例

4.4.1 requests.request()

method:提交方式(get|post);

url:提交地址;

kwargs:14个控制访问的参数;

常用的参数有:params、data、json、headers、cookies,其他参数讲解与示例将在(二)中进行介绍。

示例:

  • params:在url上传递的参数,GET形式传递到后台。
import requests

requests.request(
method = 'GET',
url = 'http://127.0.0.1:8080/example/request',
# 字典
data= { 'k1' : 'v1' , 'k2' : 'v2' , 'x':[1,2,3]}
# 字符串
data="k1=v1&k2=v2&x=[1,2,3]"
# 字节
data = bytes("k1=v1&k2=k2&x=[1,2,3]", encoding='utf8')
)
# http://www.oldboyyede.com?k1=v1&k2=v2
  • data:在请求体里面传递的数据,后面可以是字典,字节等数据类型。
import requests

requests.request(
method = 'POST',
url = 'http://127.0.0.1:8080/example/request',
# 字典
data= { 'k1' : 'v1' , 'k2' : 'v2' , 'x':[1,2,3]}
# 字符串
data="k1=v1&k2=v2&x=[1,2,3]"
# 字节
data = bytes("k1=v1&k2=k2&x=[1,2,3]", encoding='utf8')
# 文件对象
data = open('data_file.py', mode='r', encoding='utf-8')
)
  • json:在请求体里面传递数据,把整体序列化成一个大字符串,字典中嵌套字典的话用JSON序列化。
import requests

requests.request(
  method = 'POST',
  url = 'http://127.0.0.1:8080/example/request',
  json = {'k1' : 'v1', 'k2' : 'v2'}
# "{ 'k1' : 'v1' , 'k2' : 'v2' }" # 字典嵌套字典
json = json.dumps({'k1' : 'v1' , 'k2' : { 'kk1' : vv1 }}) )
  • headers:在请求体中添加请求头
import requests

requests.request(method='POST',
url='http://127.0.0.1:8080/example/request',
json={'k1': 'v1', 'k2': 'v2'},
headers={'Content-Type': 'application/x-www-form-urlencoded'}
)
  • cookies:在请求体中添加cookie
import requests

requests.request(method='POST',
url='http://127.0.0.1:8080/example/request',
data={'k1': 'v1', 'k2': 'v2'},
cookies={'cookie_example': 'cookie_value1'},
)
# 也可以使用CookieJar(字典形式就是在此基础上封装)
from http.cookiejar import CookieJar
from http.cookiejar import Cookie obj = CookieJar()
# 构建cookie
obj.set_cookie(
Cookie(
version=0,
name='c1',
value='v1',
port=None,
domain='',
path='/',
secure=False,
expires=None,
discard=True,
comment=None,
comment_url=None,
rest={'HttpOnly': None},
rfc2109=False,
port_specified=False,
domain_specified=False,
domain_initial_dot=False,
path_specified=False)
)
# 发送请求
requests.request(method='POST',
url='http://127.0.0.1:8080/example/request',
data={'k1': 'v1', 'k2': 'v2'},
cookies=obj
)

4.4.2 requests.get()

构造一个向服务器请求资源的request对象,然后返回一个包含服务器资源的response对象。

url:网址链接地址;

params:在url上传递的参数,以GET形式传递到后台,可为字典或字节流格式;

kwargs:14个控制访问的参数;

示例:

import requests
# 1、基本GET实例
# 设置url
url="http://127.0.0.1:8080/example/get"
# 调用get方法发送请求
response = requests.get(url)
# 打印请求状态码
print(response.status_code)
# 打印响应内容
print(response.text)
# 打印编码方式
print(response.encoding)
# 打印二进制形式内容
print(response.content) # 2、带参数与请求头
url = "http://127.0.0.1:8080/example/get"
params = { "username": "admin" }
header = {'User-Agent': 'chrome'}
# 将请求伪装成谷歌浏览器chrome进行访问后的User-Agent,发送GET请求接口信息
response = requests.get(url=url,params=params,headers=header)
# 如接口返回数据格式为json格式
print(response.json())
# 结果为:{ "code": 200, "msg": "请求成功", "data": [{...}] }

4.4.3 requests.head()

构造一个向服务器请求资源的request对象,获取HTML网页头信息。

url:网址链接地址;

kwargs:14个控制访问的参数;

示例:

import requests
url = "http://127.0.0.1:8080/example/get"
response = requests.head(url)
# 打印请求头信息
print(response.headers)

注:部分网址请求时,可能会遇到网络防火墙,此时添加浏览器请求头信息,可避免此类问题发生。

另外,在发送一些请求时,如:网络爬虫时,如不加headers,将会被网站识别出是python程序请求,可以使用真实的浏览器信息头,模拟发生请求(警语:请遵守爬虫Robots协议)。

import requests
url = "127.0.0.1:8080/example/get"
header = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"
response = requests.get(url=url, headers=header)
# 打印请求状态码
print(response.status_code)
# 200

4.4.4 requests.post()

构造一个向服务器请求资源的request对象,然后返回一个包含服务器资源的response对象。

url:网址链接地址;

kwargs:14个控制访问的参数;

示例:

# 1、基本POST实例
import requests payload = {'key1': 'value1', 'key2': 'value2'}
ret = requests.post("http://127.0.0.1:8080/example/post", data=payload)
print(ret.text) # 2、发送请求头和数据实例
import requests
import json url = 'http://127.0.1:8080/example/post'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'} response = requests.post(url, data=json.dumps(payload), headers=headers)
# 打印响应内容
print(response.text)
# 打印cookie
print(response.cookies)

4.4.5 其他请求

import requests

requests.put(url, data=None, **kwargs)
requests.head(url, **kwargs)
requests.delete(url, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.options(url, **kwargs) # 以上方法均是在此方法的基础上构建
requests.request(method, url, **kwargs)

5 本期常见问题

1.打印text时,出现乱码

答:1、查看是否正确配置encoding;2、查看是否为图片,图片数据为二进制数据,将图片转化为str的字符串类型,就会出现乱码。

2.打印content时,出现“\x00\x00”等内容:

答:在python中,b开头的内容,表示为bytes类型的数据。

作者:京东物流 骆铜磊

来源:京东云开发者社区

HTTP请求:requests模块基础使用必知必会的更多相关文章

  1. 迈向高阶:优秀Android程序员必知必会的网络基础

    1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...

  2. 03爬虫-requests模块基础(1)

    requests模块基础 什么是requests模块 requests模块是python中原生基于网络模拟浏览器发送请求模块.功能强大,用法简洁高效. 为什么要是用requests模块 用以前的url ...

  3. 第5节:Java基础 - 必知必会(下)

    第5节:Java基础 - 必知必会(下) 本小节是Java基础篇章的第三小节,主要讲述Java中的Exception与Error,JIT编译器以及值传递与引用传递的知识点. 一.Java中的Excep ...

  4. 【MySQL 基础】MySQL必知必会

    MySQL必知必会 简介 <MySQL必知必会>的学习笔记和总结. 书籍链接 了解SQL 数据库基础 什么是数据库 数据库(database):保存有组织的数据的容器(通常是一个文 件或一 ...

  5. Java面试必知必会:基础

    面试考察的知识点多而杂,要完全掌握需要花费大量的时间和精力.但是面试中经常被问到的知识点却没有多少,你完全可以用 20% 的时间去掌握 80% 常问的知识点. 一.基础 包括: 杂七杂八 面向对象 数 ...

  6. .NET零基础入门09:SQL必知必会

    一:前言 仿佛到了更进一步的时候了,每一个程序员迟早都会遇到数据存储的问题.我们拿什么来存储程序产生的数据?举例来说,用什么来存储我们的打老鼠游戏每次的成绩呢?选择如下: 1:内存中.缺点,退出游戏, ...

  7. 第4节:Java基础 - 必知必会(中)

    第4节:Java基础 - 必知必会(中) 本小节是Java基础篇章的第二小节,主要讲述抽象类与接口的区别,注解以及反射等知识点. 一.抽象类和接口有什么区别 抽象类和接口的主要区别可以总结如下: 抽象 ...

  8. 第3节:Java基础 - 必知必会(上)

    第3节:Java基础 - 必知必会(上) 本篇是基础篇的第一小节,我们从最基础的java知识点开始学习.本节涉及的知识点包括面向对象的三大特征:封装,继承和多态,并且对常见且容易混淆的重要概念覆盖和重 ...

  9. django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询

    from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...

  10. 【SQL必知必会笔记(1)】数据库基础、SQL、MySQL8.0.16下数据库、表的创建及数据插入

    文章目录 1.数据库基础 1.1 数据库(database) 1.2 表(table) 1.3 列和数据类型 1.4 行 1.5 主键 2.什么是SQL 3.创建后续练习所需数据库.表(MySQL8. ...

随机推荐

  1. 三分钟速览GPT系列原理

    其中,Transformer和BERT来自Google,GPT系列[GPT.GPT-1.GPT-2.GPT-3.ChatGPT.GPT-4]来自OpenAI. GPT Paper名为Improving ...

  2. 重磅!Apache Hudi联合传智教育推出免费中文视频教程

    基础介绍 Apache Hudi(简称:Hudi)使得您能在hadoop兼容的存储之上存储大量数据,同时它还提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理.这两种原语分别是: Up ...

  3. 长达 1.7 万字的 explain 关键字指南!

    当你的数据里只有几千几万,那么 SQL 优化并不会发挥太大价值,但当你的数据里去到了几百上千万,SQL 优化的价值就体现出来了!因此稍微有些经验的同学都知道,怎么让 MySQL 查询语句又快又好是一件 ...

  4. 四月八号java基础

    1.复合语句:JAVA语言不允许在两个嵌套的复合语句内声明同样的变量 2.注释:1)单行注释// 2)多行注释/*......*/3)/**......*/文件注释 3.else总是与之最近的if结构 ...

  5. Terraform 系列-Terraform Cloud 比 Terraform OSS 有哪些增强?

    系列文章 Terraform 系列文章 前言 最近在使用 Terraform Cloud 来置备 OCI 的 Always Free Tier, 发现它非常好用,相比 Terraform OSS, 用 ...

  6. Docker Compose 部署 Jenkins

    Jenkins介绍 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具 Jenkins应用广泛,大多数互联网公司都采用Jenkins配合GitLab.Docker.K8s作为实现D ...

  7. Runtime类继Robot类自动登录QQ后改进版2.0

    自动登录QQ2.0上线!!! 最近呢,有很多人问我自动登录QQ的小程序不够完善.看过我上一篇博客的人都知道,在登录QQ时运行Robot移动鼠标不够严谨,有时候会移动出错.很多小伙伴就会说了," ...

  8. 谈谈selenium中的clear后输入内容异常的处理

    谈谈selenium中的clear后输入内容异常的处理 案例 在线考试项目的登录:http://124.223.31.21:9097/#/ 代码 from selenium import webdri ...

  9. Qt 加载 libjpeg 库出现“长跳转已经运行”错误

    继上篇 Qt5.15.0 升级至 Qt5.15.9 遇到的一些错误 篇幅有点长,先说解决方法,在编译静态库时加上 -qt-libjpeg,编译出 libjpeg 库后,在项目中使用 #pragma c ...

  10. Uniswap V2 — 从代码解释 DeFi 协议

    Uniswap V2 - 从代码解释 DeFi 协议 为了理解我们在分析代码时将要经历的不同组件,首先了解哪些是主要概念以及它们的作用是很重要的.所以,和我一起裸露吧,因为这是值得的. 我在 5 个段 ...