使用node.js创build支持javascript的networking爬虫

这并不一定是一个爬虫,但我想这样说更容易理解。

给定HTML,浏览器加载/执行JavaScript(+应用样式)

我想在node.js中执行相同的任务

即。 给定一个html,node.js会加载脚本(通过<script>标记或require()调用)并执行脚本(主要用于渲染)

express.js的res.render似乎并不接受html-string作为input。

我怎样才能模拟浏览器的JavaScript渲染能力与节点? 假设node.js获得与浏览器相同的html地址?

你可以想到一个抓取HTML的网页爬虫,并执行JavaScript来呈现页面。

  • 编辑

虽然与常规爬行任务有一个很大的区别,那就是我可以在本地访问大部分JavaScript文件(或任何其他资源)。
我试图呈现在我的服务器启用JavaScript的HTML。

那么,我没有得到你的networking爬行器的意思。 但是,如果你的意思是你试图“抓取”一个网站的元素,它与你的服务器在同一个域上,而你想要得到的是一个HTML元素,我们会说一个div ,你应该安装requestcheerio框架。 如果你想在客户端做到这一点,甚至更简单:做一个AJAX,并获得你想要的jQuery的HTML元素。 这是一个服务器端(Node.js)示例:

 //APIs var cheerio = require('cheerio'); //Server-side jQuery var request = require('request'); //Simple HTTP requests request('http://localhost/page', function (error, response, html) { if (!error && response.statusCode == 200) { var $ = cheerio.load(html); var item = $("div").html(); //Do whatever you want with the result console.log(item); }); } }); 

你也可以看节点 – 幻影 – 简单。 这是非常容易使用,如果你对jQuery的舒适。 我用它来刮一些用JavaScript库创build的表格。 下面是我在ESPN上做的一个例子。 注意,对于一个基本的刮,你可以像文档中的例子一样开始你的代码。

 var driver = require('node-phantom-simple'); driver.create({ path: require('phantomjs').path }, function (err, browser) { return browser.createPage(function (err, page) { return page.open("http://espn.go.com/nba/salaries", 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 nameArray = []; $('tbody tr').each(function () { var json = {}; json.name = $(this).children(':nth-child(2)').find('a').text(); json.team = $(this).children(':nth-child(3)').text(); json.salary = $(this).children(':nth-child(4)').text() nameArray.push(json); }); return { nameArray: nameArray, }; }, function (err,result) { console.log(result); browser.exit(); }); }, 5000); }); }); }); });