繁体   English   中英

在python中已经打开的url上发送POST请求

[英]Sending POST request on an already open url in python

基本上我想发送以下表单的 POST 请求。

<form method="post" action="">
449 * 803 - 433 * 406 = <input size=6 type="text" name="answer" />
<input type="submit" name="submitbtn" value="Submit" />
</form>

我基本上想要做的是通读页面,找出表格中的方程,计算答案,输入答案作为参数与 POST 请求一起发送,但不打开页面的新 URL,作为新方程每次打开页面时都会出现,因此之前获得的结果已过时。 最后,我想获取由于发送 POST 请求而出现的页面。 我被困在我必须在不打开新 URL 实例的情况下发送 POST 请求的部分。 另外,我很感激有关如何在 POST 请求后再次通读页面的帮助。 (调用read()就足够了吗?)

我目前拥有的 python 代码看起来像这样。

import urllib, urllib2

link = "http://www.websitetoaccess.com"
f = urllib2.urlopen(link)

line = f.readline().strip()
equation = ''
result = ''
file1 = open ('firstPage.html' , 'w')
file2 = open ('FinalPage.html', 'w')

for line in f:
    if 'name="answer"' in line:
        result = getResult(line)
    file1.write(line)

file1.close()

raw_params = {'answer': str(result), 'submit': 'Submit'}
params = urllib.urlencode(raw_params)
request = urllib2.Request(link, params)
page = urllib2.urlopen(request)

file2.write(page.read())
file2.close()

是的,最后一个链接真的很有帮助,结果我只需要根据这样的请求创建一个新会话:

s = requests.session()
res1 = s.get(url)

并将其添加为发布请求之后

res2 = s.post(url, data=post_params)

我相信这实现了存储来自 get 请求的 cookie 并将它们与 post 请求一起发送的结果,从而保持与之前的 get 请求相同的问题。 非常感谢您对 Loknar 问题的帮助和帮助。

我有点困惑,POST 请求将始终是一个新的单独请求,所以我不明白您所说的“不打开新的 URL 实例”是什么意思……你有没有试过看看当你这样做时会发生什么你想手动在这个脚本中做什么? 就像在 Chrome 中打开开发者控制台一样,转到网络选项卡,将保留登录切换为开启,删除历史记录,然后手动执行您想要执行的操作? 然后在python中复制它? 此外,我建议您尝试使用 requests 模块,它比使用 urllib 更简单。 只需pip install requests (和pip install lxml )。

import requests
from lxml import etree

url = 'http://www.websitetoaccess.com'
res1 = requests.get(url)
# do something with res1.content
# you could try parsing the html page with lxml
root = etree.fromstring(res1.content, etree.HTMLParser())
# do something with root, find question and calc answer?
post_params = {'answer': str(42), 'submit': 'Submit'}
res2 = requests.post(url, data=post_params)
# check res2 for success or content?

编辑:

您可能遇到了一些标题问题或 cookie 问题。 您可能会收到一些会话 ID,它使服务器能够确定您在前一个 GET 请求中收到的问题。 POST 请求是与前一个 GET 请求分开的请求,它不能合并为一个请求。 您应该检查从之前的 GET 请求收到的标头和/或尝试设置会话/cookies 处理(如果使用请求很容易做到,请参阅https://requests.readthedocs.io/en/master/user/advanced/ )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM