X-Ray的抓取进度如何上报?
How to report the scraping progress of X-Ray?
比如我用下面的代码抓取了 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')
.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 => {
})
这将打印您抓取的页面的标题和 link。
您可以使用 .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) 只是取一个 object (结果是一个 object 的数组)并将它变成 json (第三个参数 - 那个 2 - 只是为了让它漂亮)
然后使用 fs.writeFile(本地节点模块)在 results.json
上编写 json object
你甚至可以 object 使用 forEach()
object
喜欢
results.forEach(result => {
//log the individual result and put in on an empty array, and then write the array
})
比如我用下面的代码抓取了 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')
.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 => {
})
这将打印您抓取的页面的标题和 link。
您可以使用 .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) 只是取一个 object (结果是一个 object 的数组)并将它变成 json (第三个参数 - 那个 2 - 只是为了让它漂亮)
然后使用 fs.writeFile(本地节点模块)在 results.json
上编写 json object你甚至可以 object 使用 forEach()
object喜欢
results.forEach(result => {
//log the individual result and put in on an empty array, and then write the array
})