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

时间:2017-11-09 00:03:49

标签: javascript html node.js axios

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

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

问题是我的请求(使用Axios库)在加载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!
  });

1 个答案:

答案 0 :(得分:0)

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

  

您可以在浏览器中手动执行的大多数事情都可以使用Puppeteer来完成!

查看以下内容......

 <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout       
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.ww.lab.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Do it!"
        android:id="@+id/button"
        android:onClick="sendNotification"/>
    </android.support.constraint.ConstraintLayout>

我对你的约束并不完全清楚......

  

我可以安装的内容有限制

如果你有axios,我假设你可以安装这个npm包吗?

根据您的更新,木偶操纵者也可以通过promise api制作。以下应该为你做...

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();
})();