2016-10-13 4 views
0

Je construis un scraper d'écran en utilisant Nightmare.js, et en utilisant Vo.js pour contrôler le flux. J'ai un tableau de codes postaux à partir d'un fichier CSV, et je fais une boucle dans les codes postaux, j'effectue une recherche, je suis chaque lien dans les résultats de la recherche et j'écrase cette page. Cependant, il semble seulement effectuer une recherche en utilisant le premier code postal, en sortant apparemment de la boucle tôt. Des idées? Voici mon code:Nightmare.js et Vo.js - sortie de la boucle début

var Nightmare = require('nightmare'), 
    vo = require('vo'), 
    fs = require('fs'), 
    parse = require('csv-parse'), 
    csvWriter = require('csv-write-stream'), 
    nightmare = Nightmare(), 
    writer = csvWriter(), 
    path = process.argv[2] 

var searchByPostcode = function*(postcode) { 
    var result = yield nightmare 
    .goto(URL) 
    .select('#body_umbBodyContent_BranchSearch_1_ddlRadius', 20) 
    .type('input[id=body_umbBodyContent_BranchSearch_1_txtLocation]', postcode) 
    .click('#body_umbBodyContent_BranchSearch_1_btnSearch') 
    .wait('.resultsarea .result') 
    .evaluate(function() { 
     var agents = [] 
     var results = $('.result a, .alternate_result a') 
     urls = results.map(function(r) { return BASE_URL + $(this).attr('href') }) 
     return urls 
    }) 

    return result 
} 

var getDetail = function*(url) { 
    var result = yield nightmare 
    .goto(url) 
    .wait('.wizard') 
    .evaluate(function() { 
     var company = $("div.divlabel:contains('Company:')").next('div').find('a').attr('href') 
     var name = $('h1.tint').text().trim() 
     var address = $('#address_container div:nth-child(2)').text().trim() 
     var website = $("div.divlabel:contains('Website:')").next('div').find('a').attr('href') 
     var tel = $("div.divlabel:contains('Telephone:')").next('div').text().trim() 
     var email = $("div.divlabel:contains('E-Mail:')").next('div').find('a').text().trim() 

     return { 
     url: document.URL, 
     company: company, 
     name: name, 
     address: address, 
     website: website, 
     tel: tel, 
     email: email 
     } 
    }) 

    return result 
} 

var run = function*() { 
    var agents = [] 
    var postcodes = fs.readFileSync(path, 'utf8').split('\n') 

    for (var i = 0, len = postcodes.length; i < len; i++) { 
    console.log(postcodes[i]) 
    var urls = yield searchByPostcode(postcodes[i]) 
    console.log(urls) 

    for (var i = 0, len = urls.length; i < len; i++) { 
     var agent = yield getDetail(urls[i]) 
     if (agent.email == '' & agent.company != '') { 
     company = yield getDetail('http://www.arla.co.uk/' + agent.company) 
     agent.website = agent.website == undefined ? company.website : agent.website 
     agent.email = agent.email == '' ? company.email : agent.email 
     agent.tel = agent.tel == '' ? company.tel : agent.tel 
     } 
     agents.push(agent) 
    } 

    } 

    yield nightmare.end(); 

    return agents 
} 

vo(run)() 
    .then(function(agents) { 
    writer.pipe(fs.createWriteStream('results.csv')) 
    for (var i = 0, len = agents.length; i < len; i++) { 
     writer.write(agents[i]) 
    } 
    writer.end() 
    }) 
    .catch(e => console.error(e)) 

Répondre

0

Oui, il s'avère que je suis un idiot. Je définissais les deux compteurs d'index dans ma boucle à i, donc i était réglé sur le nombre d'url après la première recherche, donc en sortant de la boucle une fois que toutes les URL avaient été analysées. D'oh!