gpt4 book ai didi

javascript - 用X射线刮取数据。多个子页面

转载 作者:行者123 更新时间:2023-12-03 03:08:55 25 4
gpt4 key购买 nike

我正在尝试从 www.metacritic.com 上获取一些数据来创建培训模块。

我可以使用 X 射线来抓取单个页面,但这个特定页面有很多子页面(针对“字母类别”)。我尝试循环遍历几个字母并执行多个抓取事件,但在使用 fs.appendFile 写入“results.json”文件时遇到问题。

我需要一种方法来抓取然后写入我的文件(目前这两个函数都立即错误。

var Xray = require('x-ray');
var xray = Xray({
filters: {
trim: function (value) {
return typeof value === 'string' ? value.trim() : value
},
reverse: function (value) {
return typeof value === 'string' ? value.split('').reverse().join('') : value
},
slice: function (value, start , end) {
return typeof value === 'string' ? value.slice(start, end) : value
}
}
});

var request = require('request');
var fs = require('fs')
var letters = ['a','b','c','d']
var resultObj = []

function eraseFile() {
fs.writeFile('results.json', '', function() {console.log('Erased')})
}

eraseFile();

for (i = 0; i < letters.length; i++) {
xray('https://www.metacritic.com/browse/tv/title/all/' + letters[i], 'li.season_product', [{
title: '.product_title | trim',
score: '.metascore_w',
url: 'a@href'
}])
.paginate('.flipper.next a@href')
(function(err, obj) {
if (err) { console.log(err) }
resultObj.concat(obj)
})
}

fs.appendFile('results.json', JSON.stringify(resultObj), function(err) {
if (err) { console.log(err) }

console.log('scraped data saved to results.json')
})

最佳答案

您没有使用promises正确。当您写入文件时,异步代码尚未完成。

您可以不使用一个 resultObj,而是在收到每个结果时将其附加到文件中。仍然存在的一个问题是,您用请求轰炸该站点,该站点可能会阻止您或将您的请求视为 DDoS 攻击。如果您需要的话,我可以提供一个节流示例,但如果不节流,代码将如下所示:

var Xray = require('x-ray');
var xray = Xray({
filters: {
trim: function (value) {
return typeof value === 'string' ? value.trim() : value
},
reverse: function (value) {
return typeof value === 'string' ? value.split('').reverse().join('') : value
},
slice: function (value, start , end) {
return typeof value === 'string' ? value.slice(start, end) : value
}
}
});

var request = require('request');
var fs = require('fs')
var letters = ['a','b','c','d']

function eraseFile() {
fs.writeFile('results.json', '', function() {console.log('Erased')})
}

eraseFile();

const makeXrayRequestFunction =
letter =>
() =>
xray('https://www.metacritic.com/browse/tv/title/all/' + letter, 'li.season_product', [{
title: '.product_title | trim',
score: '.metascore_w',
url: 'a@href'
}])
.paginate('.flipper.next a@href')
;
const handleXrayFinishedRequest =
obj =>
//resultObj.concat(obj);//doing nothing with obj
new Promise(//append single result to file
(resove,reject) =>{
fs.appendFile(
'results.json'
, JSON.stringify(obj)
, err =>
err?
reject(err) //could not write to file, return rejected promise
: resolve(obj) //could write to file, return obj
)
}
)
;
const failedXrayRequest = //just log the error when failed
err =>
console.log("failed:",err)
;
Promise.all(
letters.map( //map letters array to functions that when called will have xray make the request
makeXrayRequestFunction
)
.map(
xRayFunction =>
xRayFunction() //call the xray function, this should return a promise
.then(
handleXrayFinishedRequest //xray request was successfull, try to append to file
)
.then(
undefined
,failedXrayRequest //either xray or file writing failed, handle it
)
)
)
.then(
resultObj =>
console.log("Finished scraping")
)

关于javascript - 用X射线刮取数据。多个子页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47026284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com