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 requestsrequests.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 requestsrequests.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 requestsrequests.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 requestsrequests.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 requestsrequests.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 Cookieobj = 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 requestspayload = {'key1': 'value1', 'key2': 'value2'}ret = requests.post("http://127.0.0.1:8080/example/post", data=payload)print(ret.text)# 2、发送申请头和数据实例import requestsimport jsonurl = '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 requestsrequests.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类型的数据。

作者:京东物流 骆铜磊

起源:京东云开发者社区