2015-07-15 6 views
0

Я хочу получить таблицу полетов для каждого города со страницы, но для этого мне нужно установить поля поиска и нажать кнопку и, чтобы я должен был импортировать captcha на первой странице. Веб-сайт разработан с .Net. Я импортирую капчу самостоятельно, но я хочу сделать все остальное с nodejs. Это то, что я делаю. сначала импортируйте captcha, а затем из загруженной страницы, и посмотрите на firebug, установите заголовок запроса и url запроса, а затем отправьте с помощью http.request с помощью метода GET, чтобы снова очистить страницу с помощью nodejs. после этого я получаю viewstate страницы и снова usign firebug, устанавливаю другой заголовок запроса и «отправляю данные» и запрашиваю url и отправляю их с помощью http.request, чтобы очистить последнюю страницу. Эта информация, которую я установил с помощью firebug, исправлена; я имею в виду, URL-адреса, параметры заголовка и данные для публикации. то, что мне нужно изменить, - это название города в почтовых данных. Но я получаю страницу с пустой таблицей. если возможно, что мне делать? (извините за мой плохой английский :)) Это адрес (на персидском языке): http://sepehr.iranhrc.ir. Спасибо заранее.Очистка страницы с помощью node.js?

var http = require('follow-redirects').http; 
var querystring = require('querystring'); 
var cheerio = require('cheerio'); 

var dataToAttach = { 
    'ScriptManager1': 'uplFlightSearch|btnSubmit37756070715319', 
    '__ASYNCPOST': true, 
    '__EVENTARGUMENT': '', 
    '__EVENTTARGET': '', 
    '__LASTFOCUS': '', 
    '__VIEWSTATE': '', 
    '__VIEWSTATEGENERATOR': 'E4CF65F9', 
    'btnSubmit37756070715319': '?????', 
    'dplFrom': 'THR', 
    'dplReservationRouteType': 'RoundTrip_FixedDate', 
    'dplTo': '0', 
    'dplFlightAdults': '1', 
    'dplFlightChilds': '0', 
    'dplFlightInfants': '0', 
    'txtCountUp': '00:26', 
    'txtDepartureDate': '1394/04/02', 
    'txtReturningDate': '1394/04/04' 
}; 

var flightsSearchPageROs = { 
    hostname: 'sepehr.iranhrc.ir', 
    path: '/Systems/FA/Reservation/Flight_NewReservation_Search.aspx?qry=sbV7wBdq4B7yEk1yv0OpvmofQkdkbWH49Wjk6UIMGiw95zDjDGo0/ssWJH8Wjv1D', 
    method: 'GET', 
    headers:{ 
     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0', 
     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Language': 'en-US,en;q=0.5', 
     'Connection': 'keep-alive', 
     'Cache-Control': 'no-cache', 
     'Cookie': 'ASP.NET_SessionId=2iexj4pfxld4mdilfwttka2q;', 
     'Content-Type': 'text/html; charset=utf-8', 
     'Host': 'sepehr.iranhrc.ir', 
     'Referer': 'sepehr.iranhrc.ir' 
    } 
}; 

var resultsPageROs = { 
    hostname: 'sepehr.iranhrc.ir', 
    path: '/Systems/FA/Reservation/Flight_NewReservation_Search.aspx?action=display&rnd=2378726045210585', 
    method: 'POST', 
    headers:{ 
     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0', 
     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Language': 'en-US,en;q=0.5', 
     'Cache-Control': 'no-cache', 
     'Connection': 'keep-alive', 
     'Cookie': 'ASP.NET_SessionId=o1ipad335qahuaahc25ngalr;', 
     'Content-Length': '', 
     'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 
     'Referer': 'http://sepehr.iranhrc.ir/Systems/FA/Reservation/Flight_NewReservation_Search.aspx', 
     'Host': 'sepehr.iranhrc.ir', 
     'Pragma': 'no-cache', 
     'X-MicrosoftAjax': 'Delta=true', 
     'X-Requested-With': 'XMLHttpRequest' 
    } 
}; 

var flightsSearchPage = http.request(flightsSearchPageROs, function(response{ 
    var dataStream = ''; 
    var htmlCode = ''; 
    var date = ''; 
    response.on('data', function(chunk){ 
     dataStream += chunk; 
    }); 
    response.on('end', function(){ 
     htmlCode = cheerio.load(dataStream); 
     secondDataToAttach.__VIEWSTATE = htmlCode("__VIEWSTATE").val(); 
     resultsPageROs.headers['Content-Length'] = querystring.stringify(dataToAttach).length; 
     resultsPageRequest(); 
    }); 
}); 
flightsSearchPage.on('error', function(e){console.log("Error0: " + e.message);}); 
flightsSearchPage.end(); 

function resultsPageRequest(){ 
    var changingCitiesBoxResponse = http.request(resultsPageROs, function(response){ 
     response.setEncoding('utf8'); 
     var dataStream = ''; 
     var htmlCode = ''; 
     response.on('data', function(chunk){ 
      dataStream += chunk; 
     }); 
     response.on('end', function(){ 
      htmlCode = cheerio.load(dataStream); 
      console.log(htmlCode.html()); 
     }); 
     console.log('STATUS: ' + response.statusCode); 
    }); 
    changingCitiesBoxResponse.on('error', function(e){console.log("Error1: " + e.message);}); 
    changingCitiesBoxResponse.end(querystring.stringify(dataToAttach)); 
} 

EDIT

Одна вещь, которую я забыл упомянуть, это было то, что это будет сделано в PHP с Curl и я посмотрел на код в завиток части и сделать так же, как это с узлом и HTTP .запрос. PHP возвращает правильный ответ, но мой нет. И я фантом, как well.This это код:

var url = "http://sepehr.iranhrc.ir/Systems/FA/Reservation/Flight_NewReservation_Search.aspx?action=display&rnd=4565721642440773"; 
var settings = { 
    operation: "POST", 
    encoding: "utf8", 
    weak: false, 
    headers: { 
     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0', 
     'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
     'Accept-Language': 'en-US,en;q=0.5', 
     'Cache-Control': 'no-cache', 
     'Connection': 'keep-alive', 
     'Cookie': 'ASP.NET_SessionId=2iexj4pfxld4mdilfwttka2q;', 
     'Content-Length': '', 
     'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 
     'Referer': 'http://sepehr.iranhrc.ir/Systems/FA/Reservation/Flight_NewReservation_Search.aspx?qry=sbV7wBdq4B7yEk1yv0OpvmofQkdkbWH49Wjk6UIMGiw95zDjDGo0/ssWJH8Wjv1D', 
     'Host': 'sepehr.iranhrc.ir', 
     'Pragma': 'no-cache', 
     'X-MicrosoftAjax': 'Delta=true', 
     'X-Requested-With': 'XMLHttpRequest' 
    }, 
    data: querystring.stringify(secondDataToAttach) 
}; 

phantom.create(function (ph){ 
    ph.createPage(function (page){ 
    page.open(url2, settings, function(status){ 
     console.log(status); 
     page.evaluate(function(){ return document.body.innerHTML; }, function(result){ 
      console.log('Content ' + result); 
      ph.exit(); 
     }); 
    }); 
    }); 
}, {dnodeOpts: {weak: false} 
}); 

Но я не получил ответа. И да, он использует AJAX для отправки запроса. Согласно Firebug: enter image description here Первый запрос отправляет данные сообщения, а второй - перенаправление, которое дает ссылку на страницу результатов (я использовал эту ссылку, но не повезло), а третья - это страница результатов с детали полета, которые я не могу получить. Возможно, я использовал их неправильно. Как я могу использовать эти три запроса, чтобы получить таблицу рейсов?

+0

Давать отрицательный результат легко, но учить сложно. Это требует терпения, знаний и хорошего лечения. Может быть, я не могу выразить свой вопрос достаточно хорошо. Но если вы дадите мне беспокойство, просто будьте терпеливы и скажите мне, что не так с моим вопросом, не будет лучше (я не говорю вам, не дайте мне зарождаться). то я исправляю свой вопрос и получаю ответ, который мне нужен, и это реальная помощь, не так ли? –

+0

Начните записывать информацию и найдите проблему. Получаете ли вы ответ от вашего запроса? Если вы получаете контент на странице, как насчет загрузки cheerio? Вы можете запросить его для частей страницы? Является ли страница страницей, которую вы ожидали? Может быть, ваш пост не работает? Вам нужно проверить, что все происходит так, как вы думаете. – UltimateBrent

+0

Спасибо @UltimateBrent. да, я получаю ответ, но просто страницу без таблицы результатов (данные по полёту). На странице ответов поля заполняются в соответствии с моими данными (например, полем города или полем даты полета), но нет таблицы данных рейса (предположительно быть под полями). Я говорю о последнем запросе, без проблем с первым, и с cheerio тоже нет проблем. –

ответ

0

Я думаю, что происходит то, что страница, которую вы хотите получить, загружает их через отдельный запрос AJAX, и регулярный запрос на получение не получит этого. Вам нужно будет либо выяснить, что этот отдельный запрос, и сделать это самостоятельно, либо очистить страницу чем-то вроде PhantomJS, который может выполнять javascript для страницы.

Прежде всего, перейдите на страницу своего браузера регулярно и просмотрите вкладку сети и найдите этот запрос, который загружается в данные.

+0

Благодарим вас за ответ @UltimateBrent. Но, как вы можете видеть, я использовал этот модуль. моя проблема в том, что страница результатов пуста. Я имею в виду, что на странице нет таблицы рейсов. –

+0

Я обновил ответ. – UltimateBrent

+0

Спасибо @UltimateBrent и ценю ваше терпение. Я обновил вопрос –

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