Как сохранить сеанс с сервером .aspx, просматривая страницы через нумерацию страниц? - PullRequest
0 голосов
/ 08 июля 2019

Я не могу поддерживать сеанс с сервером .aspx.Я пытаюсь очистить данные, разбивая их на страницы, но он продолжает говорить мне: «Результаты истекли. Пожалуйста, повторите поиск».Я пытался сохранить куки, поэтому не думаю, что это проблема, если я как-то не так сделал?

Мне нужно перейти, сначала сделав запрос GET по следующему URL:

https://www.wandsworth.gov.uk/planning-and-building-control/search-planning-applications/

Ниже приведен код, который я использую для выполнения запроса.

Сначала это все мои требования

const cheerio = require('cheerio');
const url = require('url');
const rp = require('request-promise');
const ss = require('string-similarity');
const tc = require('tough-cookie');

Вот как я делаю свой запрос

var options = {
  uri: 'https://www.wandsworth.gov.uk/planning-and-building-control/search-planning-applications/',
  transform: function(body){ return cheerio.load(body) },
  method: 'GET'
}

var $ = await rp(options);

Теперь я извлекаю информацию, которая мне нужна, чтобы сделать успешный пост-запрос, и использую пакет 'string-Similarity', чтобы найти элемент select, который близко соответствует тегу, соответствующему моему входу.

// Extract selectable elements
var obj_collection = $('#cboStreetReferenceNumber')[0].children;
var collection = []; // array of inner strings for each select element

// Push innerHTML strings to collection
for(let i=0; i<obj_collection.length; i++){
     try {
         collection.push(obj_collection[i].children[0].data);
     } catch(e) {
         collection.push('');
     }
}

// Find the best match for our given address
var matches = ss.findBestMatch(address, collection);
var cboStreetReferenceNumber=
obj_collection[matches.bestMatchIndex].attribs.value;

// These are used to verify us
var __VIEWSTATE = $('#__VIEWSTATE')[0].attribs.value;
var __VIEWSTATEGENERATOR = $('#__VIEWSTATEGENERATOR')[0].attribs.value;
var __EVENTVALIDATION = $('#__EVENTVALIDATION')[0].attribs.value;
var cboMonths = 1;
var cboDays = 1;
var csbtnSearch = 'Select';
var rbGroup = 'rbNotApplicable';

// Modify options
options.uri = $('#M3Form')[0].attribs.action;
options.method = 'POST';
options.form = { 
cboStreetReferenceNumber,
__VIEWSTATE,
__VIEWSTATEGENERATOR,
__EVENTVALIDATION,
cboMonths,
cboDays,
csbtnSearch,
rbGroup
};      
options.followAllRedirects = true;
options.resolveWithFullResponse = true;
delete options.transform;

Теперь с этими опциями я готов сделать запрос на странице 1 данных, которые я ищу.

// method: @POST
// link: "Planning Explorer"
var body = await rp(options);
var $ = cheerio.load(body.body);
console.log(body.request);
var Referer = 'https://planning1.wandsworth.gov.uk' + body.req.path;

var scroll_uri = 'https://planning1.wandsworth.gov.uk/Northgate/PlanningExplorer/Generic/StdResults.aspx?PT=Planning%20Applications%20On-Line&PS=10&XMLLoc=/Northgate/PlanningExplorer/generic/XMLtemp/ekgjugae3ox3emjpzvjtq045/c6b04e65-fb83-474f-b6bb-2c9d4629c578.xml&FT=Planning%20Application%20Search%20Results&XSLTemplate=/Northgate/PlanningExplorer/SiteFiles/Skins/Wandsworth/xslt/PL/PLResults.xslt&p=10';
options.uri = scroll_uri;
delete options.form;
delete options.followAllRedirects;
delete options.resolveWithFullResponse;
options.method = 'GET';
options.headers = {};
options.headers.Referer = Referer;
options.transform = function(body){
     return cheerio.load(body);
}

var $ = await rp(options);

Как только я получу следующую страницу, ямне дают таблицу с 10 элементами и некоторым разбиением на страницы, если доступно более 10 элементов на основе моего запроса POST.

Все это идет хорошо, пока я не попытаюсь разбить на страницы 2. Получившееся тело HTML говорит мне, чтомой поиск истек и янужно повторить поиск.Это означает, что нужно вернуться к шагу 1 и снова отправить запрос POST, однако это всегда приведет меня к странице 1 нумерации страниц.

Поэтому мне нужно как-то найти способ поддерживать соединение с этим сервером, покаЯ «прокручиваю» его страницы.

Я использую node.js и request-обещание, чтобы делать свои запросы.

Вот мой код:

Я ужепытался поддерживать файлы cookie между запросами.

Кроме того, __VIEWSTATE не должно быть проблемой, поскольку запрос к странице 2 должен быть запросом GET.

1 Ответ

0 голосов
/ 10 июля 2019

Мне удалось найти обходной путь с помощью безголового браузера «Кукольник», чтобы поддерживать соединение с сервером.Однако я до сих пор не знаю, как решить эту проблему с помощью необработанных запросов.

...