使用Python手动发送Post方法

时间:2015-06-17 12:12:38

标签: python post

我想出于某些特定原因使用python发送帖子请求。 更具体一点,我想在本网站http://bac.menara.ma/ministere/中将“12064608”发送到“代码国家”。

问题在于,如果我手动发送,则响应与我们将“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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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更容易使用,因为它会处理Cookie和任何隐藏的表单字段:

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