【发布时间】:2018-08-23 21:21:30
【问题描述】:
我正在使用node js(第一次)在服务器端(self)项目上工作,我遇到了一些困难。
我的目标如下:
第一部分 - 我在我的服务器中使用“/uploads/processData” URL 从用户请求中获取 URL。
现在我想访问用户请求 URL 并获取他们的 HTML 文件,为此我使用“请求”npm 包(代码如下)。
第二部分 - 我想访问我从请求包(从第一部分)返回的正文,所以我使用cheerio npm 包来执行此操作。
现在我的问题 - 假设我正在尝试获取 url 的正文:
出于某种我无法理解的原因(可能是因为缺乏网络开发知识),我没有总是得到与使用 F12 查看上述页面(链接)时看到的相同的正文,以及我的第一部分代码。因此,有时我的 Cheerio 提取(第二部分)按我的预期工作,有时却没有(因为缺少完整/原始 HTML 文件中的某些元素)。一开始我以为可能是缓存的东西,所以我添加了一个中间件来设置“nocache”标志。
我在这里缺少什么?我尝试操作的方式是否错误?有什么方法可以确保我每次都获得相同的完整/原始 HTML?
到目前为止,这是我的代码 - 无缓存中间件
function nocache(req, res, next) {
res.header("Cache-Control", "private, no-cache, no-store, must-revalidate");
res.header("Expires", "-1");
res.header("Pragma", "no-cache");
next();
}
编辑
uploadRoutes.post("/processGoogleSearchData", nocache, (req, res) => {
//Assuming getting in req.body the google result JSON as "googleSearchResult"
var itemsArr = [];
var linksArr = [];
var bodysArr = [];
itemsArr = req.body.googleSearchResult.items;
if (itemsArr.length === 0) {
//return appropriate message
return res.status(400).send({ message: "No data sent to server" });
}
var linksArr = itemsArr.map(item => item.link);
//Get the needed info from every link
linksArr.forEach(link => {
request(link, (err, response, body) => {
if (!err && response.statusCode === 200) {
var $ = cheerio.load(body);
var tr = $(".a-lineitem").children();
var priceTd = tr.find(".a-span12");
var priceSpan = priceTd.find("#priceblock_ourprice");
console.log(priceSpan.text());
//when trying to build array of bodys the extraction doesnt work at all
bodysArr.push(body);
}
});
});
res.send(bodysArr);
});
我将代码更改为上述代码,似乎数据提取工作更频繁。谁能解释为什么提取有时仍然不起作用? 我尝试 return bodysArr 用于调试目的,但是当我这样做时,提取根本不起作用,我的路径响应始终是一个空数组,这是为什么呢?
【问题讨论】:
标签: node.js cheerio npm-request