2016-05-25 42 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請求發送,但沒有打開一個新的網址該頁面作爲每次打開頁面時出現的新等式,因此之前獲得的結果已過時。最後,我想獲取發送POST請求的結果頁面。我被困在必須發送POST請求而不打開新的URL實例的部分。另外,如果在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() 

回答

0

我有點摸不着頭腦,POST請求將永遠是一個新的,獨立的要求,所以我不明白你的意思「而無需打開一個新的URL實例」 ......你嘗試過走看看你手動在腳本中做什麼時會發生什麼?像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? 

編輯:

你可能遇到了一些問題,標題或餅乾的問題。您可能會收到一些會話ID,它使服務器能夠確定您在之前的GET請求中收到的問題。 POST請求是來自先前GET請求的單獨請求,它不能合併爲單個請求。您應該檢查從以前的GET請求收到的頭文件和/或嘗試設置會話/ cookie處理(如果使用請求,請參閱http://docs.python-requests.org/en/master/user/advanced/)。

+0

在Web瀏覽器中手動執行此操作時出現的問題是,表單需要機器驅動的響應才能正確進行身份驗證,因爲它有超時並且無法在手動完成操作時進行身份驗證,因爲人類無法正確回答速度不夠快。 – ASCH

+0

我試着按照你的建議使用請求,並且遇到了同樣的問題。我相信在你上面提供的代碼res2,它確實開始一個新的單獨的請求(這反過來改變了問題,因此使我以前存儲在答案res1錯誤的答案) – ASCH

+0

這是可能這是一個頭問題或餅乾問題? POST請求是來自先前GET請求的單獨請求,它不能合併爲一個請求。您應該檢查標題和/或嘗試使用會話(如果使用請求,則很容易添加),http://docs.python-requests.org/en/master/user/advanced/)。 – Loknar

1

是啊,這最後一個環節真正幫助,原來我只需要創建的請求,像這樣一個新的會話:

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

並經過

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

我添加此作爲POST請求相信這實現了從獲取請求中存儲cookie並將它們與發送請求一起發送的結果,從而保持與先前獲取請求相同的問題。非常感謝您在Loknar這個問題上的幫助和幫助。