egypt-banks-scraper
Version:
Scrape exchange rates from Egypt banks
84 lines (71 loc) • 2.11 kB
JavaScript
import banksClasses from './banks';
import { getBrowser } from './browser';
const banksObjects = {};
banksClasses.forEach((Bank) => {
const bankObject = new Bank();
banksObjects[bankObject.name.acronym] = bankObject;
});
// get currency rate for currencyCode
function getCurrencyRates(rates, currencyCode) {
for (let i = 0; i < rates.length; i += 1) {
const filteredRate = rates[i].code === currencyCode ? rates[i] : undefined;
if (filteredRate !== undefined) return filteredRate;
}
return null;
}
// get rates that have currency rate
function filterCurrencies(rates, currenciesCodes) {
const filteredRates = [];
currenciesCodes.forEach((code) => {
const rate = getCurrencyRates(rates, code);
if (rate === null) return;
filteredRates.push(rate);
});
return filteredRates;
}
async function getExchangeRates(banks, currencies) {
const browser = await getBrowser();
const getRates = async (bank) => {
try {
const rates = await bank.scrape(browser);
// If currencies array empty get all rates
const filteredRates = currencies.length === 0
? rates : filterCurrencies(rates, currencies);
return ({
name: bank.name,
rates: filteredRates,
});
} catch (e) {
// console.log('error on get rates:', e);
return ({
name: bank.name,
rates: [],
});
}
};
// If banks array empty get all banks names
const filteredBanks = banks.length === 0 ? Object.keys(banksObjects) : banks;
const result = {};
let banksPromises = [];
const ratesPromises = [];
for (let i = 0; i < filteredBanks.length; i += 1) {
const bankName = filteredBanks[i];
const bank = banksObjects[bankName];
if (bank) {
ratesPromises.push(getRates(bank));
}
}
banksPromises = await Promise.all(ratesPromises);
banksPromises.forEach((value) => {
result[value.name.acronym] = value;
});
await browser.close();
return result;
}
// getExchangeRates(['AIB'], []).then((data) => {
// console.log('data:', data);
// });
export {
banksObjects,
getExchangeRates,
};