Post 请求方法

Post method with Requests

我正在尝试使用 requests 模块创建一个简单的 post 方法,如下所示:

 s=requests.Session() 

 s.post(link,data=payload)

为了正确地做到这一点,有效载荷是来自页面本身的一个 id,它在每次访问页面时生成。

所以我需要从页面中获取数据,然后进行请求。

访问页面时出现的问题是会生成新的id

所以如果我们这样做:

 s=requests.Session() 

 payload=get_payload(s.get(link).text)

 s.post(link,data=payload)

它不会工作,因为当您使用 s.get 访问页面时会生成正确的 ID,但是当您进行 post 请求时,将生成一个新的 ID,因此您将正在使用旧的。

有什么方法可以在 post 请求之前从页面获取数据吗?

类似于:

 s.post(link,data=get_data(s.get(link))

当您执行 post(或获取)请求时,页面将生成另一个 ID 并将其发回给您。无法在生成页面时向页面发送数据,因为您需要先收到响应才能处理页面上的数据,一旦收到响应,服务器会在下次为您创建一个新的 id您查看页面。

有关 HTTP 请求的简单示例图片,请参阅 https://www3.ntu.edu.sg/home/ehchua/programming/webprogramming/images/HTTP.png

一般情况下是没有办法做到这一点的。服务器的响应可能会受到您发送的数据的影响,因此在您发送数据之前它是不可用的。为了跨请求保留这种信息,服务器通常会设置一个 cookie 供您在每个后续请求中发送 - 但使用 requests.Session 会自动为您处理。有可能需要根据第一次响应自己设置cookie,但是cookie是key/value对,你只是看起来有值而已。要找到密钥,更一般地说,要查明这 是否是 服务器希望您做什么,需要对您正在使用的站点有特定的了解 - 如果这是一个文档化的 API,文档将是一个很好的起点。否则,您可能需要查看网站本身的功能 - 大多数浏览器允许您查看为该网站设置的 cookie,有些(可能通过扩展)会让您查看 HTTP headers发送和接收。