#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-адреса были проанализированы. Ого!