javascript - 使用 Nightmare/Electron 进行动态分页(页面抓取)

标签 javascript node.js web-scraping electron nightmare

我正在尝试使用 Nightmare/Electron 抓取动态分页网站。我看不到执行 do... 的方法,直到使用 Nightmare 函数或使用逻辑链接评估调用的方法。

这是一个简单的代码示例,它仅通过 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);
});

最佳答案

以下代码示例是 solution 的修改版本由 segmentio/nightmare 项目的 rosshinkley 提供。这仍然需要一些工作,因为根据我目前对 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(); 
} 

关于javascript - 使用 Nightmare/Electron 进行动态分页(页面抓取),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34596811/

相关文章:

javascript - 链接到 JQuery CDN 会降低我的网站速度吗?

javascript - 在拍摄网页快照之前,谷歌机器人在文档准备好后等待多长时间?

node.js - React 和 Express iTunes Search API::错误:请求失败,状态代码为 404

python - Scrapy:下载器/response_count 与 response_received_count

Javascript 字符串替换不需要的输出

javascript - 去除轴上超出的部分

javascript - Node : Find object from array not contained in another array

jquery - 我正在使用 Angular 2 Angular-CLI 并尝试使用 ng2-datetime,但它给出了错误 "TypeError: Cannot read property ' jQuery' of undefined”

r - 如何在读取 R 中的行之前等待网页加载?

python - 如何在 Python 中使用 VPN 进行网页抓取?