node-twstock
Version:
A client library for scraping Taiwan stock market data
77 lines (76 loc) • 3.45 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.IsinScraper = void 0;
const cheerio = require("cheerio");
const iconv = require("iconv-lite");
const luxon_1 = require("luxon");
const scraper_1 = require("./scraper");
const utils_1 = require("../utils");
class IsinScraper extends scraper_1.Scraper {
async fetchListed(options) {
const { symbol } = options;
const url = `https://isin.twse.com.tw/isin/single_main.jsp?owncode=${symbol}`;
const response = await this.httpService.get(url, { responseType: 'arraybuffer' });
const page = iconv.decode(response.data, 'big5');
const $ = cheerio.load(page);
const data = $('.h4 tr').slice(1).map((_, el) => {
const td = $(el).find('td');
return {
symbol: td.eq(2).text().trim(),
name: td.eq(3).text().trim(),
exchange: (0, utils_1.asExchange)(td.eq(4).text().trim()),
type: td.eq(5).text().trim(),
industry: (0, utils_1.asIndustry)(td.eq(6).text().trim()),
listedDate: luxon_1.DateTime.fromFormat(td.eq(7).text().trim(), 'yyyy/MM/dd').toISODate(),
};
}).toArray();
return data;
}
async fetchListedStocks(options) {
const { exchange } = options;
const url = {
'TWSE': 'https://isin.twse.com.tw/isin/class_main.jsp?market=1',
'TPEx': 'https://isin.twse.com.tw/isin/class_main.jsp?market=2',
};
const response = await this.httpService.get(url[exchange], { responseType: 'arraybuffer' });
const page = iconv.decode(response.data, 'big5');
const $ = cheerio.load(page);
const data = $('.h4 tr').slice(1).map((_, el) => {
const td = $(el).find('td');
return {
symbol: td.eq(2).text().trim(),
name: td.eq(3).text().trim(),
exchange: (0, utils_1.asExchange)(td.eq(4).text().trim()),
type: td.eq(5).text().trim(),
industry: (0, utils_1.asIndustry)(td.eq(6).text().trim()),
listedDate: luxon_1.DateTime.fromFormat(td.eq(7).text().trim(), 'yyyy/MM/dd').toISODate(),
};
}).toArray();
return data;
}
async fetchListedFutOpt(options) {
const { type } = options !== null && options !== void 0 ? options : {};
const url = 'https://isin.twse.com.tw/isin/class_main.jsp?market=7';
const response = await this.httpService.get(url, { responseType: 'arraybuffer' });
const page = iconv.decode(response.data, 'big5');
const $ = cheerio.load(page);
const data = $('.h4 tr').slice(1).map((_, el) => {
const td = $(el).find('td');
return {
symbol: td.eq(2).text().trim(),
name: td.eq(3).text().trim(),
exchange: (0, utils_1.asExchange)(td.eq(4).text().trim()),
type: td.eq(5).text().trim(),
listedDate: luxon_1.DateTime.fromFormat(td.eq(7).text().trim(), 'yyyy/MM/dd').toISODate(),
};
}).toArray();
return data.filter(row => {
if (type === 'F')
return row.type.includes('期貨');
if (type === 'O')
return row.type.includes('選擇權');
return true;
});
}
}
exports.IsinScraper = IsinScraper;