Я использую кукловод для очистки страницы, содержимое которой периодически меняется, и использую экспресс для представления данных в остальные API.Если я включу Chrome без головы, чтобы увидеть, что отображается в браузере, новый data
есть, но данные не отображаются в get()
и http://localhost:3005/api-weather
.Обычный браузер показывает только исходные данные.
const express = require('express');
const server = new express();
const cors = require('cors');
const morgan = require('morgan');
const puppeteer = require('puppeteer');
server.use(morgan('combined'));
server.use(
cors({
allowHeaders: ['sessionId', 'Content-Type'],
exposedHeaders: ['sessionId'],
origin: '*',
methods: 'GET, HEAD, PUT, PATCH, POST, DELETE',
preflightContinue: false
})
);
const WEATHER_URL = 'https://forecast.weather.gov/MapClick.php?lat=40.793588904953985&lon=-73.95738513173298';
const hazard_url2 = `file://C:/Users/xdevtran/Documents/vshome/wc_api/weather-forecast-nohazard.html`;
(async () => {
try {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on("request", request => {
console.log(request.url());
request.continue();
});
await page.goto(hazard_url2, { timeout: 0, waitUntil: 'networkidle0' });
hazard = {
"HazardTitle": "stub",
"Hazardhref": "stub"
}
let forecast = await page.evaluate(() => {
try {
let forecasts = document.querySelectorAll("#detailed-forecast-body.panel-body")[0].children;
let weather = [];
for (var i = 0, element; element = forecasts[i]; i++) {
period = element.querySelector("div.forecast-label").textContent;
forecast = element.querySelector("div.forecast-text").textContent;
weather.push(
{
period,
forecast
}
)
}
return weather;
} catch (err) {
console.log('error in evaluate: ', err);
res.end();
}
}).catch(err => {
console.log('err.message :', err.message);
});
weather = forecast;
server.get('/api-weather', (req, res) => {
try {
res.end(JSON.stringify(weather, null, ' '));
console.log(weather);
} catch (err) {
console.log('failure: ', err);
res.sendStatus(500);
res.end();
return;
}
});
} catch (err) {
console.log('caught error :', err);
}
browser.close();
})();
server.listen(3005, () => {
console.log('http://localhost:3005/api-weather');
});
Я пробовал несколько решений WaitUntil , WaitFor , .then и sleep но, похоже, ничего не работает.
Интересно, имеет ли это какое-то отношение к express get ()?Я использую res.end()
вместо res.send()
, потому что json выглядит лучше, когда я использую res.end()
.Я действительно не знаю различий.
Я также готов использовать это решение reload .Но я получил ошибки и не использовал его.Я также пытался waitForNavigation () , но я тоже не знаю, как это работает.
Возможно, я использую неправильный поисковый термин, чтобы найти решение.Кто-нибудь может указать мне правильное направление?Спасибо.