dynamic分页与噩梦/电子(页面刮)

我正在尝试用Nightmare / Electron来抓取dynamic分页网站。 我没有看到一种方法来执行一个do …直到与噩梦function或链接评估调用与逻辑的方式。

下面是一个简单的代码示例,仅仅使用Google语句并从第1页返回结果hrefs。我希望代码能够在结果中的每个页面上继续。

var Nightmare = require('nightmare'); var vo = require('vo'); vo(function* () { var nightmare = Nightmare({ show: true }); var links = yield nightmare .goto('http://www.google.com') .wait('input[title="Search"]') .click('input[title="Search"]') .type('input[title="Search"]', 'Anequim Project') .click('input[name="btnK"]') .wait(600) .evaluate(function(){ var linkArray = []; var links = document.querySelectorAll('h3.r a'); for (var i = 0; i < links.length; ++i) { linkArray.push(links[i].getAttribute('href')); } return linkArray; }); yield nightmare.end(); return links; })(function (err, result) { if (err) return console.log(err); console.log(result); }); 

以下代码示例是由segmentio / nightmare项目的rosshinkley提供的解决scheme的修改版本。 这仍然需要一些工作,因为在我的testing中,使用Nightmare 2.1.2版不是100%可靠的,但是是一个很好的起点。

注意:testing时,如果您运行X次以上,Google将需要validation码。

 var Nightmare = require('nightmare'); var vo = require('vo'); vo(run)(function(err, result) { if (err) throw err; }); function* run() { var nightmare = Nightmare({ show: true }), MAX_PAGE = 100, currentPage = 0, nextExists = true, links = []; yield nightmare .goto('http://www.google.com') .wait('input[title="Search"]') .click('input[title="Search"]') .type('input[title="Search"]', 'Anequim Project') .click('input[name="btnK"]') .wait(2000) nextExists = yield nightmare.visible('#pnnext'); while (nextExists && currentPage < MAX_PAGE) { links.push(yield nightmare .evaluate(function() { var linkArray = []; var links = document.querySelectorAll('h3.r a'); return links[0].href; })); yield nightmare .click('#pnnext') .wait(2000) currentPage++; nextExists = yield nightmare.visible('#pnnext'); } console.dir(links); yield nightmare.end(); }