Web Scraping в приложении React & MongoDB Stitch - PullRequest
0 голосов
/ 18 апреля 2020

Я перевожу проект MERN в React + MongoDB Stitch, увидев, что он обеспечивает легкую аутентификацию пользователя, быстрое развертывание и т. Д. c.

Однако мне трудно понять, где и как я могу вызвать функцию очистки сайта. Ранее я перебирал в сети Express. js с помощью cheerio вроде:

app.post("/api/getTitleAtURL", (req, res) => {
  if (req.body.url) {
    request(req.body.url, function(error, response, body) {
      if (!error && response.statusCode == 200) {
        const $ = cheerio.load(body);
        const webpageTitle = $("title").text();
        const metaDescription = $("meta[name=description]").attr("content");
        const webpage = {
          title: webpageTitle,
          metaDescription: metaDescription
        };
        res.send(webpage);
      } else {
        res.status(400).send({ message: "THIS IS AN ERROR" });
      }
    });
  }
});

Но, очевидно, для Stitch Node & Express не требуется. Есть ли способ получить контент другого сайта без необходимости размещать приложение node.js, которое просто выполняет эту функцию?

Спасибо

1 Ответ

0 голосов
/ 18 апреля 2020

Оказывается, вы можете создавать функции в MongoDB Stitch , что позволяет загружать внешние зависимости .

Однако есть ограничение, например, cheerio не работал как загруженная внешняя зависимость, пока работал запрос. Таким образом, решение состоит в том, чтобы создать функцию без сервера в лямбде AWS, а затем подключить стежок mongoDB к AWS лямбда (стежок mongoDB может подключаться ко многим сторонним сервисам, включая многие облачные сервисы AWS lambda, такие как лямбда, s3, kinesis, et c).

AWS lambda позволяет загружать любые внешние зависимости, если для любого стежка mongoDB нам не нужна лямбда, но для стежка по-прежнему требуется много поддержки. В моем случае у меня была функция узла с cheerio & request в качестве внешних зависимостей, чтобы загрузить это в lambda: создать учетную запись, создать новую функцию lambda и упаковать свои модули и код узла в zip-файл, чтобы загрузить его. Ваш почтовый индекс должен выглядеть следующим образом: enter image description here

, а файл, содержащий функцию, должен выглядеть следующим образом:

    const cheerio = require("cheerio");
const request = require("request");

exports.rss = function(event, context, callback) {

  request(event.requestURL, function(error, response, body) {

    if (!error && response.statusCode == 200) {

      const $ = cheerio.load(body);
      const webpageTitle = $("title").text();
      const metaDescription = $("meta[name=description]").attr("content");
      const webpage = {
        title: webpageTitle,
        metaDescription: metaDescription
      };

      callback(null, webpage); 
      return webpage; 
    } else {
      callback(null, {message: "THIS IS AN ERROR"})
      return {message: "THIS IS AN ERROR"}; 

    }
  });
};

, а в mongoDB подключиться к третьей стороне выберите 1026 *, введите секретные ключи, которые вы получили при создании пользователя IAM amazon. В правилах -> действия выберите lambda в качестве своего API и разрешите все действия. Теперь в ваших функциях стежков mongoDB вы можете подключиться к Lambda, и в моем случае эта функция должна выглядеть следующим образом:

   exports = async function(requestURL) {
  const lambda = context.services.get('getTitleAtURL').lambda("us-east-1");

  const result = await lambda.Invoke({
    FunctionName: "getTitleAtURL",
    Payload: JSON.stringify({requestURL: requestURL})
  });

  console.log(result.Payload.text());
  return EJSON.parse(result.Payload.text());
};

Примечание: это сильно замедляет работу, хотя, как правило, это потребовалось вдвое больше времени для звонка на фини sh.

...