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 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 个管制拜访的参数;
示例:
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 个管制拜访的参数;
示例:
import requests
url = "http://127.0.0.1:8080/example/get"
response = requests.head(url)
# 打印申请头信息
print(response.headers)
注:局部网址申请时,可能会遇到网络防火墙,此时增加浏览器申请头信息,可防止此类问题产生。
另外,在发送一些申请时,如:网络爬虫时,如不加 headers,将会被网站辨认出是 python 程序申请,能够应用实在的浏览器信息头,模仿产生申请(警语:请恪守爬虫 Robots 协定)。
[]()
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 个管制拜访的参数;
示例:
# 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 其余申请
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 类型的数据。
作者:京东物流 骆铜磊
起源:京东云开发者社区