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

时间:2016-05-25 01:00:36

标签: python forms http-post

基本上我想发送以下表单的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()

2 个答案:

答案 0 :(得分:1)

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

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

之后添加此作为帖子请求
res2 = s.post(url, data=post_params)

我相信这可以实现从get请求中存储cookie并使用post请求发送它们的结果,从而保持与之前的get请求相同的问题。非常感谢你对Loknar这个问题的帮助和帮助。

答案 1 :(得分:0)

我有点疑惑,POST请求将始终是一个新的单独请求,所以我不明白你的意思&#34;没有打开一个新的URL实例&#34; ...您是否已尝试查看当您在此脚本中手动执行此操作时会发生什么?与Chrome中的开放式开发者控制台一样,转到网络标签,切换保留日志,删除历史记录,然后执行您尝试手动执行的操作?然后在python中复制它?另外我建议你试试请求模块,它比使用urllib更简单。只需DROP FUNCTION IF EXISTS myFunc; DELIMITER $$ CREATE FUNCTION myFunc( param CHAR(1) ) RETURNS INT; BEGIN DECLARE res INT; SELECT count(Dominio) INTO res FROM Thogar WHERE DOMINIO=param; RETURN res; END; $$ DELIMITER ; (和pip install requests)。

pip install lxml

编辑:

您可能会遇到一些标题问题或Cookie问题。您可能正在接收一些会话ID,使服务器能够确定您在之前的GET请求中收到的问题。 POST请求是来自先前GET请求的单独请求,它不能组合成单个请求。您应该检查从上一个GET请求收到的标头和/或尝试设置会话/ cookie处理(如果使用请求,则很容易,请参阅http://docs.python-requests.org/en/master/user/advanced/)。