您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
HTTP请求:requests使用 一 基础篇
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
HTTP请求:requests使用 一 基础篇
自猿其说Tech
2022-12-28
IP归属:未知
14240浏览
# 1 背景 http请求是常见的一种网页协议,我们看到的各种网页,其实都是发送了http请求得到了服务器的响应,从而将数据库中复杂的数据以简单、直观的方式呈现出来,方便大众阅读、使用。而如何发送http请求呢?今天来探讨一下使用requests模块,达到高效、简单的http请求操作。 # 2 什么是requests requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库,虽然标准库中的urllib2模块已经包含了平时我们使用的大多数功能,但是urllib2的API使用起来并不太友好,而requests自称“HTTP for Humans”,经过高度封装以后,可以直接调用此库的相关函数,非常方便帮助我们实现爬取HTML网页页面、模拟自动提交网络请求等操作。 ![](//img1.jcloudcs.com/developer.jdcloud.com/6d236f27-cd5b-4d9a-9a97-7fa2c6c0d48b20221228142834.png) requests模块一直在迭代更新,以完全适应当前的所有网络请求。 ![](//img1.jcloudcs.com/developer.jdcloud.com/f3ece119-90b3-45dd-b237-7687c53eacf320221228142849.png) 支持的 HTTP 特性: - 保持活动和连接池 - 国际域名和 URL - Cookie 持久性会话 - 浏览器式 SSL 验证 - 自动内容解码 - 基本 / 摘要身份验证 - 优雅的键 / 值 Cookie - 自动减压 - Unicode 响应机构 - HTTP(S)代理支持 - 分段文件上传 - 流下载 - 连接超时 - 分块请求 - .netrc 支持 - 线程安全 # 3 如何安装 安装requests模块与安装其他python模块一样,使用pip命令安装即可。 ```python pip install requests # 如需指定版本 pip install requests==2.27.1 ``` # 4 如何使用 ## 4.1 七个主要方法 ![](//img1.jcloudcs.com/developer.jdcloud.com/7b1fa6cd-e3f7-481a-b653-c4dfb1f7ed2520221228143016.png) ## 4.2 HTTP协议对资源的操作 ![](//img1.jcloudcs.com/developer.jdcloud.com/486618b5-8cf2-402e-9853-ed9969b0923420221228143035.png) ## 4.3 响应公共方法 ![](//img1.jcloudcs.com/developer.jdcloud.com/62768168-aa73-48d4-87b2-bcf8c08da2d420221228143057.png) ## 4.4 常用方式举例 ### 4.4.1 requests.request() method:提交方式(get|post); url:提交地址; **kwargs:14个控制访问的参数; ![](//img1.jcloudcs.com/developer.jdcloud.com/fc831a4b-bb7e-45dc-bb47-4527b89d3d5e20221228143127.png) 常用的参数有:params、data、json、headers、cookies,其他参数讲解与示例将在(二)中进行介绍。 示例: - params:在url上传递的参数,GET形式传递到后台。 ```python 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:在请求体里面传递的数据,后面可以是字典,字节等数据类型。 ```python 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序列化。 ```python 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:在请求体中添加请求头 ```python 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 ```python 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个控制访问的参数; **示例:** ```python 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个控制访问的参数; **示例:** ```python import requests url = "http://127.0.0.1:8080/example/get" response = requests.head(url) # 打印请求头信息 print(response.headers) ``` 注:部分网址请求时,可能会遇到网络防火墙,此时添加浏览器请求头信息,可避免此类问题发生。 另外,在发送一些请求时,如:网络爬虫时,如不加headers,将会被网站识别出是python程序请求,可以使用真实的浏览器信息头,模拟发生请求(警语:请遵守爬虫Robots协议)。 ![](//img1.jcloudcs.com/developer.jdcloud.com/96b9821d-3548-42f9-8789-316c9d3261e120221228143405.png) ```python 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个控制访问的参数; **示例:** ```python # 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 其他请求 ```python 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类型的数据。 ------------ 自猿其说Tech-JDL京东物流技术与数据智能部 **作者:骆铜磊**
原创文章,需联系作者,授权转载
上一篇:国际财务系统基于ShardingSphere的数据分片和一主多从实践
下一篇:APP流水线测试领域探索与最佳实践
自猿其说Tech
文章数
426
阅读量
2149963
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149963
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号