如何使用 Javascript 抓取 Javascript 呈现的网站?

How to scrape Javascript rendered websites using Javascript?

我正在尝试抓取此网站的 $('a[href^="mailto:"]')https://celsius.network/

当我进入浏览器控制台 运行 时,我得到一个 link 所以我知道它在那里。

问题是我的请求(使用 Axios 库)returns 加载了 javascript 之前的 DOM。我已经设置了 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 之后完全加载的那个。

P.S。我是通过 firebase 函数来做的,所以我认为我可以安装的东西是有限的。

更新

const findEmail = url =>
  new Promise((resolve, reject) => {
     // here!
  });

您的请求方法不足以模拟您在浏览器中访问页面时的预期。虽然有一些选择,但 puppeteer 可能是这份工作的候选人。

Most things that you can do manually in the browser can be done using 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();
})();

我不是很清楚你的限制...

there are limits to what I can install

如果你有 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
});