在加载页面几秒后检索页面的html内容

时间:2016-12-22 11:19:39

标签: javascript jquery node.js phantomjs cheerio

我正在编写nodejs中的脚本来自动从在线目录中检索数据。 知道我从未这样做过,我选择了javascript,因为它是我每天都使用的语言。

因此,我可以通过谷歌使用请求与cheerios轻松访问页面的dom组件中的一些提示。 我发现并检索了所有必要的信息,唯一缺失的步骤是恢复到下一页的链接,除了在加载页面4秒后生成一个链接并且链接包含一个哈希,这样这个步骤是不可避免的。

我想要做的是在加载后恢复4-5秒的dom,以便能够恢复链接

我在互联网上看了很多建议,使用PhantomJS进行这种操作,但是经过多次尝试后我无法让它工作。

这是我的代码:

#!/usr/bin/env node
require('babel-register');
import request from 'request'
import cheerio from 'cheerio'
import phantom from 'node-phantom'

phantom.create(function(err,ph) {

  return ph.createPage(function(err,page) {

    return page.open(url, function(err,status) {

      console.log("opened site? ", status);
      page.includeJs('http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js', function(err) {

        //jQuery Loaded.
        //Wait for a bit for AJAX content to load on the page. Here, we are waiting 5 seconds.

        setTimeout(function() {

          return page.evaluate(function() {

            var tt = cheerio.load($this.html())
            console.log(tt)

          }, function(err,result) {

            console.log(result);
            ph.exit();

          });

        }, 5000);

      });
    });
  });
});

但是我收到了这个错误:

  

返回ph.createPage(function(page){               ^

     

TypeError:ph.createPage不是函数

我要做的是做我想做的最好的方法吗?如果不是最简单的方法是什么?如果是这样,我的错误来自哪里?

1 个答案:

答案 0 :(得分:1)

如果您不必使用幻像,您可以使用nightmare来执行此操作。

解决像你这样的问题是非常简洁的库,它使用电子作为网络浏览器,你可以在有或没有显示窗口的情况下运行它(你也可以打开谷歌浏览器中的开发者工具)

如果你想在没有图形界面的服务器上运行它只有一个缺陷你必须至少安装帧缓冲。

Nightmare有像wait(cssSelector)这样的方法,它会等到某个元素出现在网站上。

您的代码类似于:

const Nightmare = require('nightmare');
const nightmare = Nightmare({
    show: true, // will show browser window
    openDevTools: true // will open dev tools in browser window 
});

const url = 'http://hakier.pl';
const selector = '#someElementSelectorWitchWillAppearAfterSomeDelay';

nightmare
        .goto(url)
        .wait(selector)
        .evaluate(selector => {
    return {
        nextPage: document.querySelector(selector).getAttribute('href')
    };
}, selector)
.then(extracted => {
    console.log(extracted.nextPage); //Your extracted data from evaluate
});
//this variable will be injected into evaluate callback
//it is required to inject required variables like this,
// because You have different - browser scope inside this
// callback and You will not has access to node.js variables not injected 

快乐的黑客攻击!