UNPKG

node-twstock

Version:

A client library for scraping Taiwan stock market data

77 lines (76 loc) 3.45 kB
"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;