Вопрос:

Как очистить Javascript-сайты с использованием Javascript?

javascript html node.js axios

728 просмотра

1 ответ

11738 Репутация автора

Я пытаюсь почистить $('a[href^="mailto:"]')этот сайт: https://celsius.network/

Когда я иду к консоли браузера и запускаю ее, я получаю ссылку, поэтому я знаю, что она есть.

Проблема в том, что мой запрос (с использованием библиотеки Axios) возвращает DOM до загрузки javascript. Я установил User-Agent, но, похоже, он не работает.

const axiosClient = () =>
  axios.create({
    headers: {
      "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4"
    },
    timeout: 10000
  });


axiosClient()
  .get("https://celsius.network")
  .then(({ data }) => {
    console.log("DATAAAAAAAA: ", data);
  })

Это возвращает оригинальный HTML с телом:

<body>
  <div id="app"> </div>
  ....

вместо того, который полностью загружен после того, как весь JavaScript манипулировал DOM.

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

ОБНОВИТЬ

const findEmail = url =>
  new Promise((resolve, reject) => {
     // here!
  });
Автор: bigpotato Источник Размещён: 09.11.2017 12:03

Ответы (1)


0 плюса

14129 Репутация автора

Решение

Ваш подход запроса не достаточно, чтобы подражать тому, что вы ожидаете при посещении страницы в вашем браузере. Хотя есть некоторые варианты, кукловод может быть кандидатом на работу.

Большинство вещей, которые вы можете сделать вручную в браузере, можно сделать с помощью Puppeteer!

Проверьте следующее ...

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://celsius.network/');
  const textContent = await page.evaluate(() => document.querySelector('a[href^="mailto:"]').textContent);

  console.log(textContent); // presale@celsius.network

  browser.close();
})();

Я не совсем понимаю ваши ограничения ...

есть пределы тому, что я могу установить

Если у вас есть axios, я предполагаю, что вы можете установить этот пакет npm?


Согласно вашему обновлению, кукловод также может быть создан с помощью API обещания. Следующее должно сделать это для вас ...

const findEmail = url =>
  new Promise((resolve, reject) => {
    puppeteer.launch().then((browser) => {
      browser.newPage().then((page) => {
        page.goto('https://celsius.network/').then(() => {
          page.evaluate(() => document.querySelector('a[href^="mailto:"]').textContent).then((element) => {
            resolve(element);
            browser.close();
          });
        });
      });
    });
  });

findEmail().then((email) => {
  console.log(email); // presale@celsius.network
});
Автор: scniro Размещён: 09.11.2017 02:20
Вопросы из категории :
32x32