Вы не должны вызывать fs.appendFile()
в подобном цикле, и вам может понадобиться лучший тест для пустой строки, чем просто то, что вы использовали. fs.appendFile()
- это асинхронная операция, и вы, по сути, вызываете целую кучу fs.appendFile()
операций одну за другой, не дожидаясь завершения предыдущих.
Вы можете использовать поток или подождать, пока предыдущий fs.appendFile()
не будет завершен, прежде чем вызывать следующий.
И, если вы хотите убедиться, что у вас нет пустых результатов, вам нужен лучший фильтр для результатов, в которых есть только пробел (я добавил .trim()
в свой код ниже).
Вот один из способов сделать это:
const request = require('request');
const cheerio = require('cheerio');
const fs = require('fs');
const util = require('util');
const appendFile = util.promisify(fs.appendFile);
var url = 'https://www.betfair.com/sport/football';
var customHeaderRequest = request.defaults({
headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36'}
})
customHeaderRequest.get(url, async function(err, resp, body){
try {
let $ = cheerio.load(body);
let links = $('.section-list .section:nth-child(2) .event-list li').toArray();
for (let link of links) {
const home = $(link).find('.event-information div:nth-child(3) div a div span.team-name:nth-child(1)').text().trim();
if (home) {
await appendFile('message.txt', home +'\n');
}
}
} catch(e) {
// error writing to the file, handle that error here
}
});
Другие примечания: Вы также должны всегда объявлять все локальные переменные, которые вы используете, чтобы им никогда не разрешалось быть неявными глобальными переменными.