一尘不染

抓取网页并通过单击按钮进行导航

node.js

我想在服务器端执行以下操作:

1)抓取网页
2)模拟对该页面的单击,然后导航到新页面。
3)刮开新页面
4)模拟新页面上的一些按钮单击
5)通过json或其他方式将数据发送回客户端

我正在考虑将其与Node.js一起使用。

但是我对应该使用哪个模块感到困惑
a)corpse
b)Node.io
c)Phantomjs
d)JSDOM
e)其他

我已经安装了node,io,但是无法通过命令提示符运行它。

PS:我在Windows 2008 Server中工作


阅读 248

收藏
2020-07-07

共1个答案

一尘不染

Zombie.js和Node.io在JSDOM上运行,因此您的选择要么与JSDOM(或任何等效的包装器)一起使用,要么是无头浏览器(PhantomJS,SlimerJS)或Cheerio。

  • JSDOM相当慢,因为它必须在Node.js中重新创建DOM和CSSOM。
  • PhantomJS / SlimerJS是合适的无头浏览器,因此性能还可以,而且非常可靠。
  • Cheerio是JSDOM的轻量级替代品。它不会在Node.js中重新创建整个页面(它只是下载并解析DOM-不执行任何javascript)。因此,您无法真正单击按钮/链接,但是抓取网页的速度非常快。

根据您的要求,我可能会选择无头浏览器。特别是,我之所以选择CasperJS,是因为它具有良好而富于表现力的API,而且它又快速又可靠(它不需要像JSDOM那样重新发明如何解析和渲染dom或css的方法),而且非常容易与按钮和链接等元素进行交互。

您在CasperJS中的工作流程应大致如下所示:

casper.start();

casper
  .then(function(){
    console.log("Start:");
  })
  .thenOpen("https://www.domain.com/page1")
  .then(function(){
    // scrape something
    this.echo(this.getHTML('h1#foobar'));
  })
  .thenClick("#button1")
  .then(function(){
    // scrape something else
    this.echo(this.getHTML('h2#foobar'));
  })
  .thenClick("#button2")
  thenOpen("http://myserver.com", {
    method: "post",
    data: {
        my: 'data',
    }
  }, function() {
      this.echo("data sent back to the server")
  });

casper.run();
2020-07-07