rest - Puppeteer 和 express 无法使用 REST API 加载新数据
问题描述
我正在使用 puppeteer 抓取内容会定期更改的页面,并使用 express 在 rest api 中呈现数据。如果我打开 headless chrome 来查看浏览器中显示的内容,新data
的就在那里,但数据没有显示在get()
and中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()
is 因为当我使用 .json 时 json 看起来更好res.end()
。我真的不知道区别。
我也愿意使用这个重新加载解决方案。但我收到错误并没有使用它。我也试过waitForNavigation(),但我也不知道它是如何工作的。
也许我使用了错误的搜索词来找到解决方案。谁能指出我正确的方向?谢谢你。
解决方案
推荐阅读
- python - 我如何允许在 python tkinter 的任何地方使用函数?
- python-3.x - 如何显示无效输入
- c++ - 求所有整数 1 到 N 的最大奇数之和
- javascript - 如何确保 .map 在返回之前完成。(我仍然对承诺有所了解)
- r - R中跨多个列的简洁子集
- python - 入口点子组的 Python 包发现
- pyspark - 在 pyspark 中检查零和空值无法正常工作
- c# - 使用 pulumi 运行 EF Core 迁移
- angular - 如何从 Observable 中获取数据并将其放入 Angular 数组中
- java - 如何识别文件在哪个存储设备中