Nightmare.js и Vo.js — досрочный выход из цикла

#javascript #nightmare

#javascript #кошмар

Вопрос:

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

 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 == '' amp; 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))
  

Ответ №1:

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