Cheerio未在Axios的get请求中加载HTML-所有这些都在异步意图处理程序中

问题描述 投票:0回答:1

我正在研究Alexa技能的意图,该技能将从新闻网站上获得头条新闻。我的代码在node js中,并托管在AWS Lambda上。我正在使用axios和cheerio进行Web抓取,当我从命令行在本地计算机上运行它们时,代码成功检索了HTML,cheerio能够获取所需的数据。但是,当我在Lambda上运行代码时,每次尝试用cheerio加载HTML时都会引发错误。

有趣的是,我尝试用这样的cheerio加载“ html字符串”:

const $ = cheerio.load('<h2 class="title">Hello world</h2>');

并且我能够使用它并在lambda上获取所需的数据。但是,如果我从axios检索html,并尝试用cheerio加载它,则会引发错误。这是即时通讯的电话,不起作用:

const $ = cheerio.load(response.data);

我的代码在下面:

"use strict";
const axios = require('axios');
const cheerio = require('cheerio');
const url = "https://news.ycombinator.com";

const newsHandler = {
    "newsIntent": async function () {
        var speechOutput = "";

        axios.get(url)
            .then(response => {
                data = [];
                const $ = cheerio.load(response.data);
                $("table.itemlist tr td:nth-child(3)").each((i, elem) => {
                    data.push(
                        $(elem).text().trim()
                    );
                });
                for (const headline of data) {
                    speechOutput += headline + " ";
                }
                this.emit(":tell", speechOutput);
            })
            .catch(error => {
                console.log(error);
            })
    }
}

module.exports = newsHandler;

对于描述的选择器中的所有元素,它应该能够解析从Axios检索到的HTML,并将其文本添加到数据数组中。但是,即使只是写一行:

const $ = cheerio.load(response.data);

导致错误。请帮助!

javascript node.js amazon-web-services aws-lambda alexa
1个回答
0
投票

检查您的lambda超时并尝试增加它。

我也遇到同样的情况,它正在制作带有在lambda上运行的节点的抓取器,我遇到的问题是该函数由于超时而结束。

首先我使用JSDOM,然后对两个库使用cheerio,我遇到了相同的问题。

解决方案是增加lambda超时(我的仅为3秒),我将其增加到10秒,并且可以正常工作。之后,我发现抓取单个URL的整个功能大约需要5秒钟。

© www.soinside.com 2019 - 2024. All rights reserved.