2016-05-25 10 views
1

基本的に私は次のフォームのPOSTリクエストを送信したいと思います。ページを読まれる私は基本的にやりたいPythonですでに開いているURLに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()で十分ですか?)

私は現在、このような感じです。

私は、私はあなたが「新しいURLのインスタンスを開くことなく」によって何を意味するのか理解していない...あなたが取って試してみました少し戸惑い、POST要求は常に新しい別々のリクエストになりますよ
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() 

答えて

0

このスクリプトで手動でやろうとしていることを何とかしたらどうなるか見てみましょう。 Chromeの開いているデベロッパーコンソールと同じように、[ネットワーク]タブに移動し、ログを保存したり、履歴を削除したり、手動でやろうとしていることをしたりします。その後、それをPythonで複製しますか?また、リクエストモジュールを試してみることをお勧めします。これにより、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? 

編集:

あなたはおそらくいくつかのヘッダの問題やクッキーの問題を経験しています。以前のGETリクエストで受け取った質問をサーバーが判別できるようにするセッションIDを受け取っている可能性があります。 POST要求は、前のGET要求とは別の要求であり、1つの要求に結合することはできません。以前のGETリクエストから受信したヘッダーをチェックしたり、セッション/クッキーの処理を設定したりしてください(リクエストを使用する場合は簡単です)。http://docs.python-requests.org/en/master/user/advanced/を参照してください。

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

そして

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

I後のポスト要求としてこれを追加します。

+0

ウェブブラウザで手動で行うことに問題があるのは、タイムアウトが発生したときに認証が正しく行われるように、フォームがマシン主導の応答を必要とし、人間が正しい答えを出すことができないため、十分に速いです。 – ASCH

+0

あなたが提案したようにリクエストを試みましたが、同じ問題が発生しました。私はあなたが上記で提供したコードのres2と信じています。それは新たな別のリクエストを開始します(したがってres1の質問から私の以前に保存された回答を間違えてしまいます) – ASCH

+0

これはヘッダーの問題かクッキー問題? POST要求は以前のGET要求とは別の要求であり、1つの要求に結合することはできません。ヘッダーを確認したり、セッションを試したりしてください(リクエストを使用する場合は簡単に追加できます、http://docs.python-requests.org/ja/master/user/advanced/)。 – Loknar

1

うん、本当に助けたその最後のリンクは、私はちょうどそうのような要求から新規セッションを作成するために必要な判明しますget要求からクッキーを格納し、post要求でそれらを送信する結果、前のget要求と同じ質問を維持するという結果が得られたと考えてください。この問題のあなたの助けと援助のために多くのおかげでLoknar。

関連する問題