HTTP请求:requests模块基础使用必知必会 | 京东云技术团队

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命令安装即可。

1pip install requests 2# 如需指定版本 3pip 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形式传递到后台。
1import requests 2 3requests.request( 4method = 'GET', 5url = 'http://127.0.0.1:8080/example/request', 6# 字典 7data= { 'k1' : 'v1' , 'k2' : 'v2' , 'x':[1,2,3]} 8# 字符串 9data="k1=v1&k2=v2&x=[1,2,3]" 10# 字节 11data = bytes("k1=v1&k2=k2&x=[1,2,3]", encoding='utf8') 12) 13# http://www.oldboyyede.com?k1=v1&k2=v2
  • data:在请求体里面传递的数据,后面可以是字典,字节等数据类型。
1import requests 2 3requests.request( 4method = 'POST', 5url = 'http://127.0.0.1:8080/example/request', 6# 字典 7data= { 'k1' : 'v1' , 'k2' : 'v2' , 'x':[1,2,3]} 8# 字符串 9data="k1=v1&k2=v2&x=[1,2,3]" 10# 字节 11data = bytes("k1=v1&k2=k2&x=[1,2,3]", encoding='utf8') 12# 文件对象 13data = open('data_file.py', mode='r', encoding='utf-8') 14)
  • json:在请求体里面传递数据,把整体序列化成一个大字符串,字典中嵌套字典的话用JSON序列化。
1import requests 2 3requests.request( 4  method = 'POST', 5  url = 'http://127.0.0.1:8080/example/request', 6  json = {'k1' : 'v1', 'k2' : 'v2'} 7 # "{ 'k1' : 'v1' , 'k2' : 'v2' }" 8 9# 字典嵌套字典 10json = json.dumps({'k1' : 'v1' , 'k2' : { 'kk1' : vv1 }}) 11 12)
  • headers:在请求体中添加请求头
1import requests 2 3requests.request(method='POST', 4url='http://127.0.0.1:8080/example/request', 5json={'k1': 'v1', 'k2': 'v2'}, 6headers={'Content-Type': 'application/x-www-form-urlencoded'} 7)
  • cookies:在请求体中添加cookie
1import requests 2 3requests.request(method='POST', 4url='http://127.0.0.1:8080/example/request', 5data={'k1': 'v1', 'k2': 'v2'}, 6cookies={'cookie_example': 'cookie_value1'}, 7) 8# 也可以使用CookieJar(字典形式就是在此基础上封装) 9from http.cookiejar import CookieJar 10from http.cookiejar import Cookie 11 12obj = CookieJar() 13# 构建cookie 14obj.set_cookie( 15Cookie( 16version=0, 17name='c1', 18value='v1', 19port=None, 20domain='', 21path='/', 22secure=False, 23expires=None, 24discard=True, 25comment=None, 26comment_url=None, 27rest={'HttpOnly': None}, 28rfc2109=False, 29port_specified=False, 30domain_specified=False, 31domain_initial_dot=False, 32path_specified=False) 33) 34# 发送请求 35requests.request(method='POST', 36url='http://127.0.0.1:8080/example/request', 37data={'k1': 'v1', 'k2': 'v2'}, 38cookies=obj 39)

4.4.2 requests.get()

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

url:网址链接地址;

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

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

示例:

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

4.4.3 requests.head()

构造一个向服务器请求资源的request对象,获取HTML网页头信息。
url:网址链接地址;

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

示例:

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

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

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

1import requests 2url = "127.0.0.1:8080/example/get" 3header = "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" 4response = requests.get(url=url, headers=header) 5# 打印请求状态码 6print(response.status_code) 7# 200

4.4.4 requests.post()

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

url:网址链接地址;

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

示例:

1# 1、基本POST实例 2import requests 3 4payload = {'key1': 'value1', 'key2': 'value2'} 5ret = requests.post("http://127.0.0.1:8080/example/post", data=payload) 6print(ret.text) 7 8# 2、发送请求头和数据实例 9import requests 10import json 11 12url = 'http://127.0.1:8080/example/post' 13payload = {'some': 'data'} 14headers = {'content-type': 'application/json'} 15 16response = requests.post(url, data=json.dumps(payload), headers=headers) 17# 打印响应内容 18print(response.text) 19# 打印cookie 20print(response.cookies)

4.4.5 其他请求

1import requests 2 3requests.put(url, data=None, **kwargs) 4requests.head(url, **kwargs) 5requests.delete(url, **kwargs) 6requests.patch(url, data=None, **kwargs) 7requests.options(url, **kwargs) 8 9# 以上方法均是在此方法的基础上构建 10requests.request(method, url, **kwargs)

5 本期常见问题

1.打印text时,出现乱码
答:1、查看是否正确配置encoding;2、查看是否为图片,图片数据为二进制数据,将图片转化为str的字符串类型,就会出现乱码。
2.打印content时,出现“\x00\x00”等内容:
答:在python中,b开头的内容,表示为bytes类型的数据。

作者:京东物流 骆铜磊

来源:京东云开发者社区

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

收藏这些API,获取网易云音乐数据超轻松

汇总了常见的网易云音乐API,墙裂建议点击右上角收藏下面是常见的网易云音乐get请求的API。简单介绍一下它们:评论http://music.163.com/api/v1/resource/comments/RSO4歌曲ID?limit20&offset0这应该是最最最常见的了,毕竟80%的网易云音乐的爬虫/数据分析文章都是关于评论数据使用技

PUT和POST的区别

PUT和POST是HTTP协议中两种常用的请求方法。它们有些相似之处,但也有一些重要的区别。在本文中,我们将详细介绍PUT和POST的区别。PUT请求PUT请求是HTTP协议中的一种请求方法,通常用于更新或替换服务器上的资源。使用PUT请求时,客户端需要将

python的requests模块的使用

前言:在web后台开发过程中,会遇到需要向第三方发送http请求的场景,python中的requests库可以很好的满足这一要求,这里简要记录一下requests模块的使用!说明:这里主要记录一下requests模块的如下几点:1.requests模块的安装2.requests模块发送get请求3.requests模块

Prometheus监控学习笔记之PromQL简单示例

0x00简单的时间序列选择返回度量指标http_requests_total的所有时间序列样本数据:http_requests_total返回度量指标名称为http_requests_total,标签分别是job"apiserver",handler"/api/comments"

Python使用grequests并发发送请求

\TOC\前言requests是Python发送接口请求非常好用的一个三方库,由K神编写,简单,方便上手快。但是requests发送请求是串行的,即阻塞的。发送完一条请求才能发送另一条请求。为了提升测试效率,一般我们需要并行发送请求。这里可以使用多线程,或者协程,gevent或者aiohttp,然而使用起来,都相对麻烦。greques