写点什么

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

  • 2023-06-16
    北京
  • 本文字数:3154 字

    阅读完需:约 10 分钟

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


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 CookieJarfrom http.cookiejar import Cookie
obj = CookieJar()# 构建cookieobj.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实例# 设置urlurl="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 requestsurl = "http://127.0.0.1:8080/example/get"response = requests.head(url)# 打印请求头信息print(response.headers)
复制代码


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


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



import requestsurl = "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 requestsimport 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)# 打印cookieprint(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 类型的数据。


作者:京东物流 骆铜磊

来源:京东云开发者社区

发布于: 刚刚阅读数: 4
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
HTTP请求:requests模块基础使用必知必会 | 京东云技术团队_Python_京东科技开发者_InfoQ写作社区