2016-05-25 2 views
1

В принципе, я хочу отправить запрос POST для следующей формы.Отправка запроса POST по уже открытому URL-адресу в python

<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. Я застрял в той части, где мне нужно отправить запрос 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 requestspip 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. Запрос POST представляет собой отдельный запрос из предыдущего запроса GET, он не может быть объединен с одним единственным запросом. Вы должны проверить заголовки, полученные от предыдущего запроса GET, и/или попытаться настроить обработку сеанса/файлов cookie (легко сделать, если использовать запросы, см. http://docs.python-requests.org/en/master/user/advanced/).

+0

Проблема с выполнением этого вручную в веб-браузере заключается в том, что форма требует от машинного ответа ответа для правильной аутентификации, поскольку он имеет таймаут и не может аутентифицироваться при попытке сделать это вручную просто потому, что человек не может правильно ответить достаточно быстро. – ASCH

+0

Я пытался использовать запросы, как вы предлагали, и я столкнулся с той же проблемой. Я верю, что с кодом res2 в приведенном выше коде он запускает новый отдельный запрос (который, в свою очередь, меняет вопрос, поэтому делает мой ранее сохраненный ответ из вопроса в res1 неправильным) – ASCH

+0

Возможно ли это проблема с заголовком или файлы cookie вопрос? Запрос 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) 

I верьте, что это достигает результата хранения файлов cookie из запроса на получение и отправки их с запросом на отправку, тем самым сохраняя тот же вопрос, что и предыдущий запрос на получение. Большое спасибо за вашу помощь и помощь в решении этой проблемы Локнар.

Смежные вопросы