2015-06-17 94 views
1

我想發送一個使用python的發佈請求,出於某些特定的原因。 更具體地說,我想在本網站http://bac.menara.ma/ministere/上將「12064608」發送到「國家代碼」。使用Python手動發送Post方法

問題是,如果我手動發送它,響應與我們發送輸入'12064608'到輸入不同。我發現了很多python的和平代碼,但我發現問題出現在Post方法中。 這是我的代碼:

import requests 
    data = requests.post('http://bac.menara.ma/ministere/', {'txt1': 12064608 , 'texte2' : '%2324po8%23%234'}) 
    print data.text 

來說明: http://imgur.com/S7a7500

+1

哪裏是你的代碼? – sgp

回答

0

您可以使用requests。使用requests.session可以輕鬆跟蹤必須在首次訪問時獲得的cookie。請注意,該表單包含可能會更改的隱藏字段。我沒有觀察到它在改變,但如果你需要的話,你可以使用BeautifulSoup或正則表達式來從表格中提取它。

import requests 
from bs4 import BeautifulSoup 

s = requests.session() 
r = s.get('http://bac.menara.ma/ministere/') # go to form page, get cookies and "hidden" form field 

soup = BeautifulSoup(r.content) 
texte2 = soup.find('input', attrs={'name': 'texte2'})['value'] 

data = {'txt1': '12345678', 'texte2': texte2} 
r = s.post('http://bac.menara.ma/ministere/resultat.jsp', data=data) 
html = r.content 
assert 'Nom ; ELOUARDI ASSIA' in html 

如果您不需要使用requestsmechanize更容易使用,因爲它會照顧餅乾和任何隱藏的表單字段兩個:

from mechanize import Browser 

br = Browser() 
r = br.open('http://bac.menara.ma/ministere') 
br.select_form(nr=0) 
# print br.form # displays form fields and target URL 
br.form['txt1'] = '12345678' 
r = br.submit() 
html = r.read() 
assert 'Nom ; ELOUARDI ASSIA' in html 
+0

'txt1'的帖子應該是'12064608' – heinst

+0

非常感謝。 –

+0

@heinst:這只是一個例子。 – mhawke

0

您可能需要一段時間才能做手工每一次得到一個新的JSESSIONID,因爲它可能過期。

import requests 

url = "http://bac.menara.ma/ministere/resultat.jsp" 

payload = "texte2=%2324po8%23%234&txt1=12064608" 
headers = { 
    'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 
    'origin': "http//bac.menara.ma", 
    'user-agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36", 
    'content-type': "application/x-www-form-urlencoded", 
    'referer': "http//bac.menara.ma/ministere/", 
    'accept-encoding': "gzip, deflate", 
    'accept-language': "en-US,en;q=0.8", 
    'cookie': "JSESSIONID=7EF23C675238D7AC936A58CFCA5CBA35; ___utmgb=e#ebzb; __utmt=1; __utma=268890082.1354194921.1434543682.1434543682.1434543682.1; __utmb=268890082.3.10.1434543682; __utmc=268890082; __utmz=268890082.1434543682.1.1.utmcsr=stackoverflow.com|utmccn=(referral)|utmcmd=referral|utmcct=/questions/30891272/sending-post-method-manually-using-python" 
    } 

response = requests.request("POST", url, data=payload, headers=headers) 

print(response.text) 
+0

最好使用'requests.session'而不是硬編碼cookie。 – mhawke