【问题标题】:Dynamic paging with Nightmare / Electron (page scrape)使用 Nightmare / Electron 进行动态分页(页面抓取)
【发布时间】:2016-01-04 17:45:12
【问题描述】:

我正在尝试使用 Nightmare / Electron 抓取动态分页网站。我看不到一种执行操作的方法...直到使用噩梦功能或使用逻辑链接评估调用的方法。

这是一个简单的代码示例,它只搜索一个短语并从第 1 页返回结果 href。我希望此代码在结果中的每一页都继续。

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

【问题讨论】:

    标签: javascript node.js web-scraping electron nightmare


    【解决方案1】:

    以下代码示例是segmentio/nightmare 项目的rosshinkley 提供的solution 的修改版本。这仍然需要一些工作,因为从我对 Nightmare 版本 2.1.2 的测试来看,它不是 100% 可靠,但它是一个很好的起点。

    注意:如果您运行它超过 X 次,Google 将需要验证码。

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

    【讨论】:

    • 链接[0]是怎么回事,为什么只有第一个链接?
    • @TheAnimatrix 为简洁起见,该示例返回 google 返回的每个页面的第一个链接。
    • 好吧,我认为这是一个错误,但这个解决方案存在问题,最后一页没有被刮掉,如果有人偶然发现这个问题,那么他们应该复制链接。 push() 函数到 while 循环之外,因此它可以再次运行以补偿最后一页
    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 2015-02-27
    • 2021-03-09
    • 1970-01-01
    • 2021-09-14
    相关资源
    最近更新 更多