Как сообщить о прогрессе очистки? - PullRequest
0 голосов
/ 12 сентября 2018

Как будто я скребу 3 страницы с кодом ниже:

var Xray = require('x-ray');
var x = Xray();

x('https://blog.ycombinator.com/', '.post', [{
  title: 'h1 a',
  link: '.article-title@href'
}])
  .paginate('.nav-previous a@href')
  .limit(3)
  .write('results.json')

Как я могу сообщить о прогрессе?

Я попробовал .then (), но, похоже, не работает.

x('https://blog.ycombinator.com/', '.post', [{
  title: 'h1 a',
  link: '.article-title@href'
}])
  .paginate('.nav-previous a@href')
  .limit(3)
  .write('results.json')
  .then(
  //something to report the progression
  )

Или функция обратного вызова, которая также не будет работать

x('https://blog.ycombinator.com/', '.post', [{
  title: 'h1 a',
  link: '.article-title@href'
}])(()=>{
  //something to report the progress
  })
  .paginate('.nav-previous a@href')
  .limit(3)
  .write('results.json')

1 Ответ

0 голосов
/ 27 сентября 2018

.then () может работать, но не после записи

.then () ожидал (я ДУМАЮ!) Обещание. после .write () ничего не осталось.

Вы можете попробовать удалить .write и использовать затем для console.log результатов, как это:

var Xray = require('x-ray');
var x = Xray();

x('https://blog.ycombinator.com/', '.post', [{
  title: 'h1 a',
  link: '.article-title@href'
}])
  .paginate('.nav-previous a@href')
  .limit(3)
/*   .write('results.json') */
  .then(result => {
  })

и будет напечатан заголовок и ссылка на страницу, которую вы удалили.

вы можете использовать .then () и внутри, печатать каждый результат в файл, используя что-то вроде fs, например

var Xray = require('x-ray');
const fs = require('fs')
var x = Xray();



x('https://blog.ycombinator.com/', '.post', [{
  title: 'h1 a',
  link: '.article-title@href'
}])
  .paginate('.nav-previous a@href')
  .limit(3)
  .then(results => {
    console.log(results)

    let res = JSON.stringify(results, null, 2);

    fs.writeFile('results.json', res, (err) => {
      if (err) throw err

      console.log('result saved!')
    })
  })

здесь JSON.stringify (results, null, 2) просто берет объект (result является массивом объектов) и превращает его в json (третий аргумент - что 2 - просто делает его красивым)

затем, используя fs.writeFile (модуль нативного узла), вы пишете объект json в results.json

вы даже можете сделать его объектом за объектом, используя forEach ()

как

 results.forEach(result => {
 //log the individual result and put in on an empty array, and then write the array
})
...