Перехват POST-запроса с помощью Mechanize

#ruby-on-rails #ruby #post #screen-scraping #mechanize

#ruby-on-rails #ruby #Публикация #очистка экрана #механизировать

Вопрос:

Я пытаюсь использовать Mechanize для захвата запроса POST, который невозможен через форму, потому что форма находится внутри iframe, который предотвращает загрузку напрямую через javascript.

HTTP-заголовки являются следующими в примере запроса из Google Chrome (обратите внимание на parada и linea параметры)

 Request URL:http://www.etr.gov.ar/getSmsResponse.php
Request Method:POST
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:es-419,es;q=0.8
Connection:keep-alive
Content-Length:21
Content-Type:application/x-www-form-urlencoded
Host:www.etr.gov.ar
Origin:http://www.etr.gov.ar
Referer:http://www.etr.gov.ar/cont-cuandollega.php
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.30 Safari/534.30
X-Requested-With:XMLHttpRequest

Form Dataview URL
parada:4152
linea:112

Response Headers
Connection:close
Content-Length:111
Content-Type:text/html
Date:Fri, 03 Jun 2011 02:35:45 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:PHP/5.1.2
ASP.NETl
  

И содержимое для этого примера является:

 Linea 112N: 0min. 379mts., siguiente 25min. 9937mts. - Linea 112R: 81min. 24349mts., siguiente 101min. 30548mts
  

Что я пробовал с mechanize, так это следующий скрипт ruby, но в ответ я получаю пустую страницу:

 require 'mechanize'
agent = WWW::Mechanize.new
agent.post("http://www.etr.gov.ar/getSmsResponse.php", "parada" => "4152", "linea"=>"112")
  

Что я мог бы делать неправильно? Большое вам спасибо.

ОБНОВЛЕНИЕ: Передача POST в виде хэша сработала отлично. Чтобы отобразить содержимое, мне нужно было только выполнить agent.post.content

Ответ №1:

На самом деле, ваш исходный код работал нормально. Вам просто нужно распечатать его как agent.post.content , чтобы увидеть результаты.


Чтобы ответить на ответ mightilybix:

Причина, по которой ваш код работает без передачи хэша с использованием { и }, заключается в том, что в Ruby есть функция, при которой, если вы передаете хэш в качестве последнего аргумента функции, вам не нужно включать фигурные скобки. Например:

 def test(str, params)
  puts str
  params.each { |param| puts param }
end
  

Вызов:

 test("hello", {"animal" => "cat", "gender" => "m"})
  

это то же самое, что и вызов:

 test("hello", "animal" => "cat", "gender" => "m")
  

Ответ №2:

Метод post ожидает параметры в виде хэша. Попробуйте:

 agent.post("http://www.etr.gov.ar/getSmsResponse.php", {"parada" => "4152", "linea"=>"112"})
  

Комментарии:

1. Я проголосовал против этого, потому что нет никакой разницы в том, как Ruby интерпретирует параметры между этим кодом и исходным кодом. Это не решает проблему.

2. Достаточно справедливо. Спасибо, что указали на это. Я протестировал это, и вы правы.