使用Nightmare/Electron动态分页(分页)

Dynamic paging with Nightmare / Electron (page scrape)

本文关键字:分页 动态 Electron Nightmare 使用      更新时间:2023-09-26

我正试图用噩梦/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);
});

下面的代码示例是segmentio/梦魇项目的roshinkley提供的解决方案的修改版本。这仍然需要一些工作,因为从我对噩梦2.1.2版本的测试来看,它不是100%可靠的,但这是一个很好的起点。

注意:当测试时,如果你运行它超过X次,谷歌将需要一个captcha。

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(); 
}