requests页面常用操作(post、put、get、head、patch、delete方法)

      • 1 requests主要方法
      • 2 请求返回信息
      • 3 应用
        • 3.1 登录页面
        • 3.2 退出登录
        • 3.3 修改参数
        • 3.4 上传文件

  Requests 是一个 Python 的 HTTP 客户端库。
  每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息。可以通过requests模拟提交请求来操作web页面。
例:

import requests

# 发送请求
response = requests.get('https://www.runoob.com/')

# 返回网页内容
print(response.text)

requests页面常用操作(post、put、get、head、patch、delete方法)_第1张图片

1 requests主要方法

方法 内容
delete(url, args) 向网页提交删除请求
get(url, params, args) 获取html网页的主要方法
head(url, args) 获取html网页头信息
patch(url, data, args) 向html网页提交局部修改请求
post(url, data, json, args) 向网页提交post请求
put(url, data, args) 向网页提交put请求
request(method, url, args) 构造一个请求,支撑其他各种方法的基础方法

post、put和patch的区别:
(1) POST方法请求的目标是一个行为处理器 ,重复进行POST方法会导致多条相同的数据被创建。虽然多次执行结果不是相同的,但其实这些数据除了自增的id不同以外,其他部分的数据都是相同的;
(2) 新增数据应该使用POST,修改现有数据应该使用PUT;
(3) PATCH方法是新引入的,是对PUT方法的补充,用来对已知资源进行局部更新。即PUT是修改了整条记录,不变的字段也重写,而PATCH只是单独修改一个字段。

2 请求返回信息

  每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息。
响应信息如下:
requests页面常用操作(post、put、get、head、patch、delete方法)_第2张图片

3 应用

  requests发送http请求的结构如下。
requests页面常用操作(post、put、get、head、patch、delete方法)_第3张图片
1、通过页面开发者工具(点击键盘F12或者空白处右击点击检查)中的Network,查看进行登录操作时提交的内容;
2、根据请求中的内容编写对应内容进行请求。
requests页面常用操作(post、put、get、head、patch、delete方法)_第4张图片
requests页面常用操作(post、put、get、head、patch、delete方法)_第5张图片
Headers部分参数含义:
(1) User-Agent:Mozilla/5.0 (平台) 引擎版本 浏览器版本号;
(2) Accept:可接受的内容类型;
(3) Host:服务器的域名或IP地址,如果不是通用端口,还包含该端口号,例如:Host: www.some.com:182;
(4) Content-Length:一个请求的请求体的内存长度,单位为字节(byte)。请求体是指在HTTP头结束后,两个CR-LF字符组之后的内容,常见的有POST提交的表单数据,这个Content-Length并不包含请求行和HTTP头的数据长度;
(5) ccept-Encoding:浏览器可以处理的编码方式;
(6) ccept-Language:浏览器接收的语言,其实也就是用户在什么语言地区,例如简体中文的就是 Accept-Language: zh-CN;
(7) Cache-Control:这个指令在request和response中都有,用来指示缓存系统(服务器上的,或者浏览器上的)应该怎样处理缓存;
(8) Connection:告诉服务器这个user agent(通常就是浏览器)想要使用怎样的连接方式。值有keep-alive和close。http1.1默认是keep-alive。keep-alive就是浏览器和服务器 的通信连接会被持续保存,不会马上关闭,而close就会在response后马上关闭。
  其中content-type可以参考Content-Type 详解

3.1 登录页面

  使用的是post方法,body即网页中我们看到的payload中的内容,headers即网页中Requests Headers中的内容。

def post(url, data=None, json=None, **kwargs):
    r"""Sends a POST request.

    :param url: URL for the new :class:`Request` object.
    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
        object to send in the body of the :class:`Request`.
    :param json: (optional) json data to send in the body of the :class:`Request`.
    :param \*\*kwargs: Optional arguments that ``request`` takes.
    :return: :class:`Response ` object
    :rtype: requests.Response
    """

    return request("post", url, data=data, json=json, **kwargs)
def login_pon():
    """
    登陆设备web页面
    :return:响应信息
    """
    login_url = 'http://192.168.XXX.XXX/XXX/XXX/formLogin'
    headers = {
        'Host': '192.168.XXX.XXX',
        'Origin': 'http://192.168.XXX.XXX',
        'Referer': 'http://192.168.XXX.XXX/wlbasic.asp?v=1673339477000',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/108.0.0.0 Safari/537.36',
    }
    body = {
        'username': 'XXX',
        'password': 'XXX'
    }
    res = requests.post(url=login_url, data=body, headers=headers)
    if res.status_code == 200:
        log.info("登录成功!")
    return res
3.2 退出登录

  使用的get方法,get方法的参数放在头中,与post放在body中不同。

    def get(self, url, **kwargs):
        r"""Sends a GET request. Returns :class:`Response` object.

        :param url: URL for the new :class:`Request` object.
        :param \*\*kwargs: Optional arguments that ``request`` takes.
        :rtype: requests.Response
        """

        kwargs.setdefault("allow_redirects", True)
        return self.request("GET", url, **kwargs)

requests页面常用操作(post、put、get、head、patch、delete方法)_第6张图片

def logout():
    """
    退出登录
    :return:
    """
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
                  'application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip,deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'keep-alive',
        'Host': '192.168.XXX.XXX',
        'Referer': 'http://192.168.XXX.XXX/XXX/formLogout',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/108.0.0.0 Safari/537.36 '
    }
    url_logout = 'http://192.168.XXX.XXX/XXX/formLogout'
    res_logout = requests.get(url=url_logout, headers=headers)
    if res_logout.status_code == 200:
        log.info("logout成功!")
    return res_logout
3.3 修改参数
def ssid_change(ssid):
    """
    修改WiFi参数
    """
    body = {
        'band': '2',
        'mode': '0',
        'ssid': ssid,
		...
    }
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
                  'application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Cache-Control': 'max-age=0',
        'Connection': 'keep-alive',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Host': '192.168.XXX.XXX',
        'Origin': 'http://192.168.XXX.XXX',
        'Referer': 'http://192.168.XXX.XXX/XXX',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/108.0.0.0 Safari/537.36',
    }
    url_change_mode = 'http://192.168.XXX.XXX/XXX/formWlanSetup'
    return requests.post(url=url_change_mode, headers=headers, data=body)
3.4 上传文件

  使用的patch方法。
  PUT方法的实体无结构的,它直接把实体部分的数据替换到服务器的资源上。而PATCH提供的实体则需要根据程序或其它协议的定义,解析后在服务器上执行,以此来修改服务器上的数据。

def import_file(srvUrl, file):
    """
    上传文件
    :param srvUrl: http://192.168.150.XXX/XXX
    :param file: 要上传的文件名
    :return:
    """
    try:
        header = {
            'Accept': '*/*',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Connection': 'keep-alive',
            'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundarynX9ZcZCeJ4MKpx88',
            'Cookie': 'XXX',
            'Host': '192.168.XXX.XXX',
            'Origin': 'http://192.168.XXX.XXX',
            'Referer': 'http://192.168.XXX.XXX',
            'User-Agent': 'Mozilla / 5.0(WindowsNT10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome/108.0.0.0Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest'
        }
        body = {
            'ModuleFeatureDecomposition': "[{\"url\":\"/XXX/XXX/XXX\",\"file_name\":\"XXX\"}]",
            'SoftwareOverview': "[{\"url\":\"/XXX/XXX/XXX\",\"file_name\":\"XXX\"}]",
        }
        resp = requests.patch(url=srvUrl, headers=header, data=json.dumps(body))
        print(resp.status_code)
        if resp.status_code != requests.codes.ok:
            return "error!"

        name = os.path.basename(file)
        with open(file, "rb") as conf:  # rb mode,读取二进制
            upFile = {
                'file': (name, conf)
            }
            resp = requests.patch(url=srvUrl, files=upFile)
        print(resp.status_code)
    except Exception as ex:
        print(ex)

你可能感兴趣的:(python,python)