抓取页面 - 一个部分未使用cheerio加载

-1 html javascript web-scraping meteor cheerio

我正在用cheerio 和meteor 刮一个社交网络。我可以登录,搜索一些信息并在页面上抓取我想要的信息。我正在发出请求并将 html 传递给cheerio,就像用 Meteor.js抓取一样。

问题是,只有当我通过网络浏览器加载页面时,才会出现页面的一部分:

在浏览器中:

<div A>
    <div B>
        <ul (...)>
            <li (...)>...</li>
            ...
            <li (...)>...</li>
        </ul>
    </div> <-- end B -->
    <script id="NAME_1" type="fs/embed+m"></script>
    <script type="text/javascript">fs.dupeXHR("NAME_1","NAME_2",{"renderControl":"custom","templateId":"NAME_1"});</script>
</div> <-- end A -->
Run Code Online (Sandbox Code Playgroud)

在 console.log(cherio.load(html)) 中:

<div A>
    <script id="NAME_1" type="fs/embed+m"></script>
    <script type="text/javascript">fs.dupeXHR("NAME_1","NAME_2",{"renderControl":"custom","templateId":"NAME_1"});</script>
</div> <-- end A -->
Run Code Online (Sandbox Code Playgroud)

我假设 html 是由cheerio 加载的,而不执行脚本。我对吗?如果是这样,有什么方法可以让cheerio 执行脚本,这样我就可以在放置内容后抓取页面?

我正在使用以下选项发出 http 请求来模拟浏览器请求,所以我认为这不是请求本身的问题(无头浏览器不会让它变得更好)。

Options = function (cookie) {
  this.headers = {
    "Accept": "*/*",
    "Connection": "keep-alive",
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.132 Safari/537.36"
  };
  this.params = {};
  if (cookie) {
    this.headers.Cookie = cookie.get();
  }
};
Run Code Online (Sandbox Code Playgroud)

ajd*_*uke 5

在抓取时你需要考虑几件事。

现代网站正在使用较新的框架,如 Angular、EmberJS,这些网站 HTML 是使用 Javascript 呈现的(右键单击浏览器窗口,然后单击View Page source,您会看到没有任何 HTML 的裸 html)

这也与 Meteor 应用程序相同。

所以对于这些类型的你需要使用像PhantomJSZombieJS这样的无头浏览器来获取 HTML 内容并将其用于抓取

希望这可以帮助