Я не могу поддерживать сеанс с сервером .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.