HTTP请求:requests模块基础使用必知必会

打印 上一主题 下一主题

主题 578|帖子 578|积分 1734

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命令安装即可。
  1. pip install requests
  2. # 如需指定版本
  3. 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形式传递到后台。
  1. import requests
  2. requests.request(
  3. method = 'GET',
  4. url = 'http://127.0.0.1:8080/example/request',  
  5. # 字典
  6. data= { 'k1' : 'v1' , 'k2' : 'v2' , 'x':[1,2,3]}
  7. # 字符串
  8. data="k1=v1&k2=v2&x=[1,2,3]"
  9. # 字节
  10. data = bytes("k1=v1&k2=k2&x=[1,2,3]", encoding='utf8')
  11. )
  12. #  http://www.oldboyyede.com?k1=v1&k2=v2
复制代码

  • data:在请求体里面传递的数据,后面可以是字典,字节等数据类型。
  1. import requests
  2. requests.request(
  3. method = 'POST',
  4. url = 'http://127.0.0.1:8080/example/request',
  5. # 字典
  6. data= { 'k1' : 'v1' , 'k2' : 'v2' , 'x':[1,2,3]}
  7. # 字符串
  8. data="k1=v1&k2=v2&x=[1,2,3]"
  9. # 字节
  10. data = bytes("k1=v1&k2=k2&x=[1,2,3]", encoding='utf8')
  11. # 文件对象
  12. data = open('data_file.py', mode='r', encoding='utf-8')
  13. )
复制代码

  • json:在请求体里面传递数据,把整体序列化成一个大字符串,字典中嵌套字典的话用JSON序列化。
  1. import requests
  2. requests.request(
  3.   method = 'POST',
  4.   url = 'http://127.0.0.1:8080/example/request',
  5.   json = {'k1' : 'v1', 'k2' : 'v2'}
  6. # "{ 'k1' : 'v1' , 'k2' : 'v2' }"
  7. # 字典嵌套字典
  8. json = json.dumps({'k1' : 'v1' , 'k2' : { 'kk1' : vv1 }})
  9. )
复制代码

  • headers:在请求体中添加请求头
  1. import requests
  2. requests.request(method='POST',
  3. url='http://127.0.0.1:8080/example/request',
  4. json={'k1': 'v1', 'k2': 'v2'},
  5. headers={'Content-Type': 'application/x-www-form-urlencoded'}
  6. )
复制代码

  • cookies:在请求体中添加cookie
  1. import requests
  2. requests.request(method='POST',
  3. url='http://127.0.0.1:8080/example/request',
  4. data={'k1': 'v1', 'k2': 'v2'},
  5. cookies={'cookie_example': 'cookie_value1'},
  6. )
  7. # 也可以使用CookieJar(字典形式就是在此基础上封装)
  8. from http.cookiejar import CookieJar
  9. from http.cookiejar import Cookie
  10. obj = CookieJar()
  11. # 构建cookie
  12. obj.set_cookie(
  13. Cookie(
  14. version=0,
  15. name='c1',
  16. value='v1',
  17. port=None,
  18. domain='',
  19. path='/',
  20. secure=False,
  21. expires=None,
  22. discard=True,
  23. comment=None,
  24. comment_url=None,
  25. rest={'HttpOnly': None},
  26. rfc2109=False,
  27. port_specified=False,
  28. domain_specified=False,
  29. domain_initial_dot=False,
  30. path_specified=False)
  31. )
  32. # 发送请求
  33. requests.request(method='POST',
  34. url='http://127.0.0.1:8080/example/request',
  35. data={'k1': 'v1', 'k2': 'v2'},
  36. cookies=obj
  37. )
复制代码
4.4.2 requests.get()

构造一个向服务器请求资源的request对象,然后返回一个包含服务器资源的response对象。
url:网址链接地址;
params:在url上传递的参数,以GET形式传递到后台,可为字典或字节流格式;
kwargs:14个控制访问的参数;
示例:
  1. import requests
  2. # 1、基本GET实例
  3. # 设置url
  4. url="http://127.0.0.1:8080/example/get"
  5. # 调用get方法发送请求
  6. response = requests.get(url)
  7. # 打印请求状态码
  8. print(response.status_code)
  9. # 打印响应内容
  10. print(response.text)
  11. # 打印编码方式
  12. print(response.encoding)
  13. # 打印二进制形式内容
  14. print(response.content)
  15. # 2、带参数与请求头
  16. url = "http://127.0.0.1:8080/example/get"
  17. params = { "username": "admin" }
  18. header = {'User-Agent': 'chrome'}
  19. # 将请求伪装成谷歌浏览器chrome进行访问后的User-Agent,发送GET请求接口信息
  20. response = requests.get(url=url,params=params,headers=header)
  21. # 如接口返回数据格式为json格式
  22. print(response.json())
  23. # 结果为:{ "code": 200, "msg": "请求成功", "data": [{...}] }
复制代码
4.4.3 requests.head()

构造一个向服务器请求资源的request对象,获取HTML网页头信息。
url:网址链接地址;
kwargs:14个控制访问的参数;
示例:
  1. import requests
  2. url = "http://127.0.0.1:8080/example/get"
  3. response = requests.head(url)
  4. # 打印请求头信息
  5. print(response.headers)
复制代码
注:部分网址请求时,可能会遇到网络防火墙,此时添加浏览器请求头信息,可避免此类问题发生。
另外,在发送一些请求时,如:网络爬虫时,如不加headers,将会被网站识别出是python程序请求,可以使用真实的浏览器信息头,模拟发生请求(警语:请遵守爬虫Robots协议)。
  1. import requests
  2. url = "127.0.0.1:8080/example/get"
  3. 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"
  4. response = requests.get(url=url, headers=header)
  5. # 打印请求状态码
  6. print(response.status_code)
  7. # 200
复制代码
4.4.4 requests.post()

构造一个向服务器请求资源的request对象,然后返回一个包含服务器资源的response对象。
url:网址链接地址;
kwargs:14个控制访问的参数;
示例:
  1. # 1、基本POST实例
  2. import requests
  3. payload = {'key1': 'value1', 'key2': 'value2'}
  4. ret = requests.post("http://127.0.0.1:8080/example/post", data=payload)
  5. print(ret.text)
  6. # 2、发送请求头和数据实例
  7. import requests
  8. import json
  9. url = 'http://127.0.1:8080/example/post'
  10. payload = {'some': 'data'}
  11. headers = {'content-type': 'application/json'}
  12. response = requests.post(url, data=json.dumps(payload), headers=headers)
  13. # 打印响应内容
  14. print(response.text)
  15. # 打印cookie
  16. print(response.cookies)
复制代码
4.4.5 其他请求
  1. import requests
  2. requests.put(url, data=None, **kwargs)
  3. requests.head(url, **kwargs)
  4. requests.delete(url, **kwargs)
  5. requests.patch(url, data=None, **kwargs)
  6. requests.options(url, **kwargs)
  7. # 以上方法均是在此方法的基础上构建
  8. requests.request(method, url, **kwargs)
复制代码
5 本期常见问题

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表