requests方法的post请求方式

2023-11-12

0x01前言

对post请求方式,我们需要明确表单内容的类型,一般情况下,直接提交data参数即可,但如果前端对此有所校验,就需要根据实际情况进行调整。

0x02常见的post方式

post form-data
这里我自己搭建了个简单的登陆界面
源码如下 login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*"  pageEncoding="utf-8" %>
<%
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
        System.out.println(basePath);
%>
<html>
<head>
    <title>登陆</title>
</head>
<body>
<form action="<%=basePath%>loginServlet" method="post">

    <tabel align="center">
        <tr>
            <td height="200"></td>
        </tr>
        <tr><td>用户名:</td><td ><input type="text" name="username"></td></tr>
        <tr><td>密码:</td><td ><input type="password" name="password"></td></tr>
        <tr>
            <td colspan="2" align="center">
                <input type="submit" value="提交">
            </td>
        </tr>
    </tabel>
</form>
</body>
</html>

运行界面:
在这里插入图片描述
用于处理登陆请求的loginServlet.java如下:

@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
    //doGet实现页面转发
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/login.jsp").forward(req,resp);
        System.out.println("访问了login.jsp");
    }
    //doPost处理post请求
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username");
        req.getSession().setAttribute("username",username);
        String path = req.getContextPath();
        resp.sendRedirect(path + "/index/main.jsp");
    }
}

登陆成功后的main.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页</title>
</head>
<body>
<h1>这是主页</h1>
welcome you ,${username}
</body>
</html>

我们填写账号,密码后点击登陆
同时打开dev-tools 看一下请求情况
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接着用python模拟看看
python代码如下:

import requests

start_url = 'http://localhost:8080/loginServlet'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
data = {
    'username': 'aaa',
    'password': 'aaa'
}
response = requests.post(start_url,headers=headers,data=data)
print(response.text)

响应结果:
在这里插入图片描述
可以看到成功了

0x03两种通用思路处理post请求失败的网站

3.1使用json=data传值

首先我们来看一个例子
url:aHR0cHM6Ly93d3cua3VhaXNob3UuY29tL3Byb2ZpbGUvM3h4Ymt3ZDhta250ZWFj
在这里插入图片描述
先抓包分析接口

在这里插入图片描述payload:
在这里插入图片描述

注意我这里圈起来的content-type:用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件。这意味这我们直接以data的形式post,或许不行了。可以尝试一下

这里我们使用json = data进行post

response = session.post(self.start_url,headers=self.headers,json=self.data)

在这里插入图片描述
可以看到成功请求到了
请求代码如下:

class ksSpider(object):
    def __init__(self):
        self.start_url = "https://www.kuaishou.com/graphql"
        self.headers = {

            'Cookie': 'kpf=PC_WEB; kpn=KUAISHOU_VISION; clientid=3; did=web_74dfd4a4a602c0350b9d5a6715e61e87',
            'Referer': 'https://www.kuaishou.com/profile/3xxbkwd8mknteac',
            'User-Agent': random.choice(USER_AGENT_LIST)
        }
        self.data = {"operationName":"visionProfilePhotoList","variables":{"userId":"3xxbkwd8mknteac","pcursor":"1.637041162378E12","page":"profile"},"query":"fragment photoContent on PhotoEntity {\n  id\n  duration\n  caption\n  likeCount\n  viewCount\n  realLikeCount\n  coverUrl\n  photoUrl\n  photoH265Url\n  manifest\n  manifestH265\n  videoResource\n  coverUrls {\n    url\n    __typename\n  }\n  timestamp\n  expTag\n  animatedCoverUrl\n  distance\n  videoRatio\n  liked\n  stereoType\n  profileUserTopPhoto\n  __typename\n}\n\nfragment feedContent on Feed {\n  type\n  author {\n    id\n    name\n    headerUrl\n    following\n    headerUrls {\n      url\n      __typename\n    }\n    __typename\n  }\n  photo {\n    ...photoContent\n    __typename\n  }\n  canAddComment\n  llsid\n  status\n  currentPcursor\n  __typename\n}\n\nquery visionProfilePhotoList($pcursor: String, $userId: String, $page: String, $webPageArea: String) {\n  visionProfilePhotoList(pcursor: $pcursor, userId: $userId, page: $page, webPageArea: $webPageArea) {\n    result\n    llsid\n    webPageArea\n    feeds {\n      ...feedContent\n      __typename\n    }\n    hostName\n    pcursor\n    __typename\n  }\n}\n"}
    def parse_start_url(self):
        response = session.post(self.start_url,headers=self.headers,json=self.data)
        print(response.text)
3.2使用xhr断点,找出最初post的数据

这里我换个url:
aHR0cDovL3d3dy53aGdnenkuY29tL1BvbGljaWVzQW5kUmVndWxhdGlvbnMvaW5kZXguaHRtbD91dG09c2l0ZXNfZ3JvdXBfZnJvbnQuMmVmNTAwMWYuMC4wLmZkNGU1ODMwMDhiYjExZWQ5ZjIzYjUzNmUyN2YwNmFk
在这里插入图片描述
我们先传入data进行post

data = {"categoryCode": "GovernmentProcurement", "pageSize": 15, "pageNo": 1}
        response = session.post(self.start_url,headers=self.headers,data=data).text

当然失败了
在这里插入图片描述
接着我们复制api的资源路径 /front/search/category 添加xhr断点

在这里插入图片描述
触发请求
关注scope
在这里插入图片描述
在这里插入图片描述
在控制台输出一下s[“data”],很明显是字符串
在这里插入图片描述
那么我们把Headers补全,试试post 这个字符串
代码如下:

data2 = "{\"categoryCode\":\"GovernmentProcurement\",\"pageSize\":\"15\",\"pageNo\":\"2\"}"

response = session.post(self.start_url,headers=self.headers,data=data2).text

在这里插入图片描述
成功
完整代码:

class wSpider(object):
    def __init__(self):
        self.start_url = "http://www.whggzy.com/front/search/category"
        self.headers = {

            "Content-Type": "application/json",
            "X-Requested-With": "XMLHttpRequest",
            'Cookie': 'acw_tc=2f624a2b16583799791827338e7686367845620cecc4e2a1b7ed6f85bbdd0a',
            'Referer': 'http://www.whggzy.com/PoliciesAndRegulations/index.html',
            'user-agent' : random.choice(USER_AGENT_LIST)
        }

    def parse_start_url(self):
        data = {"categoryCode": "GovernmentProcurement", "pageSize": 15, "pageNo": 1}
        data2 = "{\"categoryCode\":\"GovernmentProcurement\",\"pageSize\":\"15\",\"pageNo\":\"2\"}"

        response = session.post(self.start_url,headers=self.headers,data=data2).text
        print(response)

if __name__ == '__main__':
    w = wSpider()
    w.parse_start_url()
0x04总结

post的时候需要根据具体情况 大致来说表单用data= 表单字典用 json=;同时还可以通过xhr断点来确定发送的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

requests方法的post请求方式 的相关文章

随机推荐

  • AI相关基础知识

    1 神经网络中的filter 滤波器 与kernel 内核 的概念 kernel 内核是一个2维矩阵 长 宽 filter 滤波器是一个三维立方体 长 宽 深度 其中深度便是由 多少张内核构成 两者之间的关系 可以说 kernel 是fil
  • Taro 2.2 全面插件化,支持拓展和定制个性化功能

    自 2 2 开始 Taro 引入了插件化机制 允许开发者通过编写插件的方式来为 Taro 拓展更多功能或者为自身业务定制个性化功能 欢迎大家进行尝试 共同讨论 当前版本 2 2 1 官方插件 Taro 提供了一些官方插件 tarojs pl
  • git每次提交需要输入账号密码

    git bash进入项目目录 执行命令 git config global credential helper store 命令配置好之后 再操作一次git pull 然后它会提示你输入账号密码 这一次之后就不需要再次输入密码了
  • 官方精简版!Windows 10 LTSC 2021 正式发布

    微软现已正式发布 Windows 10 企业版 LTSC 2021 LTSC 全称为 the Long Term Servicing Channel 即长期服务频道 使用 LTSC 服务模型 Windows 10 电脑可以延迟接收功能更新
  • 权限控制:自定义注解,AOP注入

    1 自定义注解 自定义注解可以写业务需要的函数逻辑 验证权限 自定义注解有两个必要的元注解 1 Target 用来描述注解的修饰范围 共四种 a TYPE 类 接口 enum b METHOD 方法 c PARAMETER 方法变量 d P
  • FATFS移植、调试过程(在STM32上使用W25Q64)

    上面是我的微信和QQ群 欢迎新朋友的加入 花了几天的时间好不容易自己移植好了FATFS 以前一般都是用别个现成的东西 真的自己移植还是有一点点的操蛋 移植FATFS其实不难 当然这是对于一个成功移植好的人来说 FATFS移植资料网上有一大堆
  • 如何获取变量token的值

    一 什么是token 1 客户端使用用户名跟密码请求登录 2 服务端收到请求 去验证用户名与密码 3 验证成功后 服务端会签发一个 Token 再把这个 Token 发送给客户端 4 客户端收到 Token 以后可以把它存储起来 比如放在
  • Getting Started with Formal Verification

    原文链接 https www eeweb com getting started with formal verification Methodology is the key in using formal property checki
  • 2023最新ChatGPT网站源码+支持ChatGPT4.0+支持Midjourney绘画+用户会员套餐+后台管理+一键更新版本

    2023最新ChatGPT网站源码 支持ChatGPT4 0 支持Midjourney绘画 用户会员套餐 后台管理 一键更新版本 支持手机电脑不同布局页面自适应 ChatGPT商用网站源码搭建安装教程 第一步 下载程序 ChatGPT商业运
  • 如何安装Centos7.9系统

    目录 一 背景 二 安装准备 1 主机硬件配置信息 2 Centos7 9系统安装盘 三 安装步骤 1 BIOS设置U盘启动 2 设置系统语言 3 设置系统安装位置 4 设置网络和主机名 5 设置ROOT用户密码 四 安装后验证 五 问题记
  • Java学习(对象与类)——文档注释,生成JavaDoc文件

    目录 注释的插入 类注释 方法注释 字段注释 通用注释 包注释 生成帮助文档JavaDoc 注释的插入 javadoc实用工具从下面几项中抽取信息 模块 包 公共类和接口 公共的和受保护的字段 公共的和受保护的构造器及方法 每个文档注释 包
  • 安装系统跳过创建用户,直接以超级管理员身份进入系统

    方法一 1 shift F10进入dos界面 2 输入net user administrator active yes 来启动超级管理员 3 输入regedit 来启动注册表 4 把如图下红框选项所有数值项改为0 5 接着退出注册表 输入
  • 运行时错误:Error: free(): invalid next size (fast)

    经查 这通常发生在C C 混合编程时候调用的内存分配 释放接口不配对时 即malloc分配的内存 却用了delete或者new出来的对象 却用了free 只要确保 malloc free new delete配对 该问题就消失了
  • Promise的Catch报错总结

    在使用Promise时 异步返回的结果可能会两种 一种是使用resolve返回 另一种是使用reject返回 当使用reject返回时 会throw一个Error出来 这时的这个Error需要Catch住 在Promise中Catch一个E
  • 1600*B. Jumping Jack(数学&&找规律)

    解析 一直往右条 直到第一次超过 x 如果当前和目标点 p x为偶数 则 p x 2 的那一步向左跳 这样会少跳 p x 正好补在多跳的这一段 如果为奇数 则不能除2 则继续跳 直到距离为偶数即可 x和x答案一样 include
  • java中this的使用

    一 本类中方法 属性 构造器的调用 1 属性的调用 当构造器中初始化对象的时候 如果形参名与属性名相同 这时候可以在等号左边的属性前面加上this表示 这个指向的是类的属性而不是指向形参 2 方法的调用 3 构造器的调用 1 在定义含参构造
  • kafka的核心参数配置

    2 kafka配置参数 broker id broker的id id是唯一的非负整数 集群的broker id不能重复 log dirs kafka存放数据的路径 可以是多个 多个使用逗号分隔即可 port server接受客户端连接的端口
  • 项目管理是做什么?

    项目管理在大企业中应用比较多 那么项目管理是做什么 项目管理能够为企业起到什么作用 1 什么是项目 项目是为完成一款产品 一项服务或者一种可交付成果进行的临时性任务 也就是说项目具有一个范围 时间等特性 需要在某一个时间段完成某一范围内的任
  • 25章 SPI—读写串行FLASH

    SPI 协议简介 3 条总线分别为SCK 时钟 MOSI 主出从入 MISO 主入从出 片选线为SS1 2 3 从设备 多少设备也就这三条ss MOSI和MISO能看出是全双工 输入输出两条线 可同时使用 NSSx下降沿选中当前设备 上升沿
  • requests方法的post请求方式

    0x01前言 对post请求方式 我们需要明确表单内容的类型 一般情况下 直接提交data参数即可 但如果前端对此有所校验 就需要根据实际情况进行调整 0x02常见的post方式 post form data 这里我自己搭建了个简单的登陆界