所以我一直在研究我的项目,其中涉及刮刀。
接下来是工作流:现在有两个刮板。数据将被解析并推送到每个单独刮板的数组中,并传递给合并组件。
因此合并组件如下所示:
let mergedApartments = []; //Creating merged list of apartments
exports.mergeData = (apartments) => {
//Fetching all apartments that are passed from scraper(s)
mergedApartments.push(...apartments); //Pushing apartments into the list
console.log(mergedApartments.length);
};所以现在mergedApartments.length的输出是9 39。第一个函数调用mergeData()并将其传递给数组,其中包含9个对象,而另一个刮板在数组中包含30个对象,后者再次传递给mergeData。
这不是我所期望的。我期望有一个数组,其中包含来自刮板的所有合并对象。现在,scraperno1发送公寓并将其添加到mergedApartments中,然后scraperno2发送公寓,并通过向数组中添加新的adding对象来覆盖该数组。
现在,我需要不同的输出:我只想从数组中得到一个包含所有合并对象的列表。因为这些数据将传递给存储组件,而且我不想多次查询DB,因为对于每个新的mergedApartments列表,数据将被插入并创建重复的值--抛出一个错误。
所以,我尝试过:我尝试创建一个计数器,它计算函数mergeData调用的时间,然后执行合并的逻辑,但是没有成功。
所以我只想让我的数组有一个mergedApartments.length的输出-在这个例子中是39。
谢谢!
编辑这里的刮刀是什么样子:
const merge = require('../data-functions/mergeData');
const axios = require('axios');
const cheerio = require('cheerio');
//function for olx.ba scraper. Fetching raw html data and pushing it into array of objects. Passing data to merge function
exports.santScraper = (count) => {
const url = `https://www.sant.ba/pretraga/prodaja-1/tip-2/cijena_min-20000/stranica-${count}`;
const santScrapedData = [];
const getRawData = async () => {
try {
await axios.get(url).then((response) => {
const $ = cheerio.load(response.data);
$('div[class="col-xxs-12 col-xss-6 col-xs-6 col-sm-6 col-lg-4"]').each(
(index, element) => {
const getLink = $(element).find('a[class="re-image"]').attr('href');
const getDescription = $(element).find('a[class="title"]').text();
const getPrice = $(element)
.find('div[class="prices"] > h3[class="price"]')
.text()
.replace(/\.| ?KM$/g, '')
.replace(',', '.');
const getPicture = $(element).find('img').attr('data-original');
const getSquaremeters = $(element)
.find('span[class="infoCount"]')
.first()
.text()
.replace(',', '.')
.split('m')[0];
const pricepersquaremeter =
parseFloat(getPrice) / parseFloat(getSquaremeters);
santScrapedData[index] = {
id: getLink.substring(42, 46),
link: getLink,
descr: getDescription,
price: Math.round(getPrice),
pictures: getPicture,
sqm: Math.round(getSquaremeters),
ppm2: Math.round(pricepersquaremeter),
};
}
);
merge.mergeData(santScrapedData); //here i'm calling function and passing array to function
});
} catch (error) {
console.log(error);
}
};
getRawData();
};其他刮板看起来一样(这是相同的函数调用)
发布于 2021-02-17 08:33:58
为此,您需要使用来自数组原型的concat函数
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat
exports.mergeData = (apartments) => {
mergedApartment = mergedApartments.concat(apartments);
};
exports.sendData = () => {
console.log(mergedApartment.length);
}在你的主要剧本里
getRawData().then(merge.sendData);https://stackoverflow.com/questions/66238293
复制相似问题