finvizor
Version:
Get finviz stock data in proper format
88 lines (87 loc) • 3.88 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getStock = void 0;
const cheerio_1 = require("cheerio");
const utils_1 = require("./utils");
const getStock = async (ticker = '') => {
try {
if (ticker === '') {
throw new Error('No ticker provided!');
}
ticker = ticker.replace(/\./g, '-');
const page = await (0, utils_1.getStockPage)(ticker);
if (page === '') {
throw new Error('Finviz: ticker is not found or service is unavailable.');
}
// Select page data
const $ = (0, cheerio_1.load)(page, null, false), headersTabLinks = $('.content > div > div:nth-child(1) > div > div > div.quote-links > div:nth-child(1)').find('a.tab-link'), mainTable = $('.content div.screener_snapshot-table-wrapper > table > tbody').find('tr'), insidersTable = $('tr.fv-insider-row');
// Parse non tabular data
let stock = {
ticker: $('h1.quote-header_ticker-wrapper_ticker').text().replace(/-/g, '.'),
name: $('div.quote-header > div.quote-header_left > div > h2 > a').text().trim(),
site: $('div.quote-header > div.quote-header_left > div > h2 > a').attr('href'),
exchange: $(headersTabLinks)
.eq(3)
.text()
.replace(/[^a-zA-Z]+/g, ''),
sector: $(headersTabLinks).eq(0).text(),
industry: $(headersTabLinks).eq(1).text(),
country: $(headersTabLinks).eq(2).text(),
};
// Iterate through main financial table
mainTable.map((i, line) => {
const elements = $(line).find('td');
elements.each((i, td) => {
// 0 1 2 3
// line => key:value:key:value etc.
if (i % 2) {
// Set values
const key = $(elements[i - 1]).text(), value = $(td).first().text();
stock[key] = value;
}
else {
// Set keys
const key = $(td).text();
stock[key] = '';
}
});
});
// 🩼 crutch injection 🩼
if (stock['Dividend Est.'] !== undefined &&
stock['Dividend Est.'] !== '' &&
stock['Dividend Est.'] !== '-') {
// split value like 0.99 (0.43%) to 0.99 and (0.43%)
stock['Dividend'] = stock['Dividend Est.'].split(' ')[0];
stock['Dividend Percent'] = stock['Dividend Est.'].split(' ')[1];
delete stock['Dividend Est.'];
delete stock['Dividend TTM'];
}
stock = (0, utils_1.fixKeys)(stock);
stock = (0, utils_1.fixValues)(stock);
// Create insiderDeals array
stock.insidersDeals = [];
for (let i = 0; i < insidersTable.length; i++) {
const line = insidersTable[i];
const elements = $(line).find('td');
const insObj = {
insiderTrading: (0, utils_1.capitalizeFirstLetters)($(elements[0]).text().toLowerCase()),
insiderTradingLink: 'https://finviz.com/' + $(elements[0]).find('a').attr('href'),
relationship: $(elements[1]).text(),
date: $(elements[2]).text(),
transaction: $(elements[3]).text(),
cost: $(elements[4]).text(),
shares: $(elements[5]).text(),
value: $(elements[6]).text(),
sharesTotal: $(elements[7]).text(),
secForm4: $(elements[8]).text(),
secForm4Link: $(elements[8]).find('a').attr('href'),
};
stock.insidersDeals.push(insObj);
}
return stock;
}
catch (error) {
throw new Error(error);
}
};
exports.getStock = getStock;