Javascript 使用Dream/Electron的动态分页(页面刮取)

Javascript 使用Dream/Electron的动态分页(页面刮取),javascript,node.js,web-scraping,electron,nightmare,Javascript,Node.js,Web Scraping,Electron,Nightmare,我正试图用Dream/Electron来抓取动态分页网站。我看不到一种方法来执行一个do。。。直到使用噩梦函数或使用逻辑链接求值调用 下面是一个简单的代码示例,只需通过谷歌搜索一个短语并返回第1页的结果hrefs。我希望这段代码在结果中的每一页都能继续 var Nightmare = require('nightmare'); var vo = require('vo'); vo(function* () { var nightmare = Nightmare({ show: true }

我正试图用Dream/Electron来抓取动态分页网站。我看不到一种方法来执行一个do。。。直到使用噩梦函数或使用逻辑链接求值调用

下面是一个简单的代码示例,只需通过谷歌搜索一个短语并返回第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);
});
var噩梦=require(“噩梦”);
var vo=要求('vo');
vo(函数*(){
var噩梦=噩梦({show:true});
var links=收益率噩梦
后藤先生('http://www.google.com')
.wait('input[title=“Search”]”)
。单击('input[title=“Search”]”)
.type('input[title=“Search”],'Anequim Project')
。单击('input[name=“btnK”]”)
.等等(600)
.评估(功能){
var linkArray=[];
var links=document.querySelectorAll('h3.ra');
对于(变量i=0;i
下面的代码示例是rosshinkley提供的segmentio/噩梦项目的a的修改版本。这仍然需要一些工作,因为从我在噩梦2.1.2版的测试来看,它不是100%可靠的,但它是一个很好的起点

注意:当测试时,如果你运行它超过X倍,谷歌将需要验证码

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(); 
} 
var噩梦=require(“噩梦”);
var vo=要求('vo');
vo(运行)(功能(错误、结果){
如果(错误)抛出错误;
});
函数*run(){
var噩梦=噩梦({show:true}),
最大页数=100,
currentPage=0,
nextExists=正确,
链接=[];
屈服噩梦
后藤先生('http://www.google.com')
.wait('input[title=“Search”]”)
。单击('input[title=“Search”]”)
.type('input[title=“Search”],'Anequim Project')
。单击('input[name=“btnK”]”)
.等等(2000年)
nextExists=收益率噩梦.visible('#pnnext');
而(nextExists&¤tPage
链接[0]有什么问题,为什么只有第一个链接?@TheAnimatrix为简洁起见,该示例返回谷歌返回的每个页面的第一个链接。好吧,我认为这是一个排序错误,但该解决方案存在一个问题,最后一个页面没有被刮除,如果有人偶然发现这个问题,那么他们应该将links.push()函数复制到while循环之外,这样它就可以再次运行以补偿最后一页