如何在 NodeWebkit 的 html 代码中访问节点模块中的抓取数据

Posted

技术标签:

【中文标题】如何在 NodeWebkit 的 html 代码中访问节点模块中的抓取数据【英文标题】:How do I access the scraped data from node module in my html code in NodeWebkit 【发布时间】:2016-04-06 10:13:15 【问题描述】:

我正在尝试使用 NodeWebkit 创建一个应用程序。 我正在使用 node-phantom-simple 模块抓取内容。 使用该模块,我能够从网站上抓取内容。但是我应该如何在 html 端访问它。我认为我无法为这种情况创建休息服务。 这是代码示例:

var file = require('file.js');
var gui = require('nw.gui');

var menu = new gui.Menu( type: 'menubar' );

var express = require('express');
var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var app     = express();

var driver = require('node-phantom-simple');



url = 'http://www.espncricinfo.com/';

request(url, function(error, response, html)
    if(!error)
        var $ = cheerio.load(html);

        var title, release, rating;
        var json =  title : "", release : "", rating : "";

        $('.scoreline-list').first().filter(function()
            var data = $(this);
            var numOfMatches = data.children().length;
            console.log("Number of Matches:  ",numOfMatches);
            var matches=[];

            //GET URL FOR EACH MATCH
            for(x=0;x<numOfMatches;x++)
            
                var lielem = data.children().eq(x);
                matches[x] = "http://www.espncricinfo.com" + lielem.children().first().attr('href');
                $('#editor').val(matches[x]);
                console.log(matches[x]);

            

            //FOR EACH MATCH URL
            for(x=0;x<numOfMatches;x++)
              
                var matchurl = matches[x];   
                //console.log(matchurl);
                driver.create( path: require('phantomjs').path , function (err, browser) 
                  return browser.createPage(function (err, page) 
                    return page.open(matchurl, 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 () 
                            //Get what you want from the page using jQuery. A good way is to populate an object with all the jQuery commands that you need and then return the object. 
                            var h2Arr = [];

                            $('.innings-information').each(function ()  h2Arr.push($(this).html()); );

                            return 
                              h2: h2Arr
                            ;
                          , function (err,result) 
                            console.log(result);
                            browser.exit();
                          );
                        , 5000);
                      );
                      );
                  );
                );
             setTimeout(function()
                    //waiting for the jquery to load
                , 5000);

             //END FOR LOOP EACH MATCH URL




        )
    
)

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您为什么不能为此创建一个休息端点?只需缓存每个抓取操作的结果,并在 http-endpoint 上返回缓存。

var cache=;

app.get('/myendpoint', function(req, res) 
    res.json(cache);
)

request(url, function(error, response, html)
    ...
    setTimeout(function () 
        ...
            console.log(result);
            //set cache here
            cache=result;
            browser.exit();
        );
   , 5000);
);

app.listen(1338);

如果要缓存更新,请将抓取函数包装在 setInterval 中。

var cache=;

app.get('/myendpoint', function(req, res) 
    res.json(cache);
)

function updateCache() 
    request(url, function(error, response, html)
        ...
        setTimeout(function () 
            ...
                console.log(result);
                //set cache here
                cache=result;
                browser.exit();
            );
       , 5000);
    );


//Update cache every 60 secs.
setInterval(updateCache, 60000);

app.listen(1338);

【讨论】:

以上是关于如何在 NodeWebkit 的 html 代码中访问节点模块中的抓取数据的主要内容,如果未能解决你的问题,请参考以下文章

node webkit- 从父窗口捕获 iframe 鼠标事件

Node Webkit Desktop App - 浏览器默认缓存PDF文件

NW.js 入坑指南

facebook 桌面应用程序的重定向 url

socket.io 身份验证在第一个连接上不起作用

如何在html中调用js代码