2016-10-13 2 views
0

Я строю экранный скребок с использованием Nightmare.js и используя Vo.js для управления потоком. У меня есть массив почтовых индексов из CSV и прокручивается через почтовые индексы, выполняйте поиск, следуйте каждой ссылке в результатах поиска и очищайте эту страницу. Тем не менее, кажется, что когда-либо выполнялся поиск с использованием первого почтового индекса, который, казалось бы, вышел из цикла раньше. Есть идеи? Вот мой код:Nightmare.js и Vo.js - выход из цикла рано

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

ответ

0

Да, оказывается, я идиот. Я устанавливал оба счетчика индекса в моем цикле в i, поэтому i получал заданный счетчик URL после первого поиска, поэтому он вышел из цикла после того, как все URL-адреса были проанализированы. D'о!

Смежные вопросы