Извлеките текст с помощью приветствия

#javascript #screen-scraping #cheerio

Вопрос:

Я пытаюсь написать скрипт для извлечения идентификатора электронной почты и имени с этого веб-сайта. Я попробовал следующий фрагмент, но он не работает.

    <!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>foo</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>
    <div>
        <strong style="color: darkgreen;">Can read this tag</strong>

        <object id="external_page" type="text/html" data="https://aleenarais.com/buddy/" width="800px" height="600px"
            style="overflow:auto;border:5px ridge blue">
            <!-- I want to read tag values from this object -->
        </object>
    </div>

    <script>
        window.addEventListener('load', function () {
            const item = [];
            $('strong[style="color: darkgreen;"]').each(function () {
                item.push($(this).text())
            })
            console.log(item)

        })
       
    </script>
</body>

</html>
 

Есть ли лучший способ сделать это? Или можно преобразовать всю страницу в строку и извлечь электронное письмо с помощью регулярного выражения?

Ответ №1:

Адрес электронной почты и имя на веб-странице отображаются в iframe. Источником iframe является внешний источник. Для того, чтобы вы могли извлечь информацию, вам необходимо использовать браузер без головы для этого.

Я бы предложил использовать Node.Джей Си и кукловод (https://www.npmjs.com/package/puppeteer)

 const puppeteer = require("puppeteer");
(async() => {
  const url = "https://aleenarais.com/buddy/";
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url, {
    waitUntil: "networkidle0"
  });
  var frames = await page.frames();
  var myframe = frames.find(
    (f) => f.url().indexOf("https://feedium.app/fetchh.php") > -1
  );
  const textFeed = await myframe.$eval("strong", (sElements) =>
    sElements.map((el) => el.textContent)
  );
  console.log(textFeed.splice(1)); //Array contains both name and email
  await browser.close();
})(); 

Кукольник загружает страницу так же, как пользователь загружает страницу. Он ждет, пока не будут выполнены все сетевые вызовы (см. Сетевой режим ожидания 0), а затем пытается найти iframe, у которого есть URL (fetchh.php). Если вы наблюдаете, имя и электронная почта присутствуют в сильных тегах, и это единственные доступные сильные теги. Следовательно, мы извлекаем сильные теги, удаляем счетчик, и у нас остаются только имя и адрес электронной почты.

Вывод: [ ‘J J’, ‘j*j@gmail.com’ ] //Я только что замаскировал значения, но программа выдает фактические

Шаги для запуска сценария:

  1. Установить Node.Js (https://nodejs.org/en/download/)
  2. Установите кукловода с помощью (npm i кукловод)
  3. скопируйте скрипт и поместите его в файл (demo.js)
  4. В терминале перейдите в каталог, в котором demo.js присутствует, а затем запустите узел demo.js

Вы должны увидеть результат.

Ответ №2:

Попробуй это:

 window.addEventListener('load', function () {
            let item = [];
            $('strong[style*="color: darkgreen;"]').each(function (index, item) {
                item.push($(this).text())
            })
            console.log(item)
}
 

Комментарии:

1. Работает с внешними тегами, но это не то, что я хотел. (пожалуйста, проверьте правки)