就像我用以下代码抓取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')
答案 0 :(得分:1)
.then()可以工作,但写后不能工作
.then()期望(我认为!)一个承诺。 .write()之后,什么都没有了。
您可以尝试删除.write并使用then来控制台.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)只是获取一个对象(结果是一个对象数组)并将其转换为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
})