Skip to main content

KLSE Screener Python Library - Malaysian (KLSE/Bursa) stock data scraper with fundamentals, price history, and announcements

Project description

klse-screener-py

Malaysian (KLSE/Bursa Malaysia) stock data scraper. Fetch fundamentals, trading data, news, and announcements from KLSE Screener.

Features

  • 17 data functions covering fundamentals, trading data, news, and announcements
  • Rate-limited HTTP client (2-second intervals, respectful scraping)
  • Market detection for KLSE tickers (*.KL format)
  • No caching - host application controls caching strategy
  • Dict-only responses - lightweight, no Pydantic dependency
  • Sync-only - use with asyncio.to_thread() or executor for async

Installation

pip install klse-screener-py

Quick Start

from klse_screener import (
    get_klse_fundamentals,
    get_klse_news,
    get_klse_trade_summary,
    get_klse_comments,
)

# Get fundamentals
data = get_klse_fundamentals("5132.KL")
print(f"P/E: {data.get('pe_ratio')}")
print(f"Dividend Yield: {data.get('dividend_yield')}")

# Get news
news = get_klse_news("5132.KL", limit=10)
print(news)

# Get order book depth
summary = get_klse_trade_summary("5132.KL")
print(f"Bid Volume: {summary.get('total_bid_volume'):,}")
print(f"Ask Volume: {summary.get('total_ask_volume'):,}")

API Reference

Fundamentals

Function Description Returns
get_klse_fundamentals(ticker) P/E, EPS, DY, NTA, P/B, ROE, RSI Dict[str, Any]
get_klse_enhanced_fundamentals(ticker) + debt ratios, stochastic, volume Dict[str, Any]
get_klse_annual(ticker, limit=3) Annual revenue, profit, EPS str
get_klse_quarterly_history(ticker, limit=20) Multi-quarter history str
get_klse_dividends(ticker, limit=5) Dividend history with dates str
get_klse_capital_changes(ticker, limit=5) Splits, bonus issues str

Trading Data

Function Description Returns
get_klse_intraday_stats(ticker) High/Low/Open/Volume, Bid/Ask Dict[str, Any]
get_klse_trade_summary(ticker) Order book depth (15-min delayed) Dict[str, Any]
get_klse_trade_details(ticker, limit=50) Time-stamped trades List[Dict]
get_klse_warrants(ticker, limit=5) Warrant prices, volumes str

Sentiment & News

Function Description Returns
get_klse_news(ticker, limit=10) Stock-specific news str
get_klse_announcements(ticker, limit=10) Bursa Malaysia announcements str
get_klse_comments(ticker, limit=30) Forum discussions List[Dict]
get_klse_shareholding_changes(ticker, limit=20) Institutional transactions str

Market Data

Function Description Returns
get_klse_market_sentiment() Market overview str
get_klse_full_report(ticker) All data consolidated Dict[str, Any]

Formatted Wrappers

Function Description Returns
get_klse_comments_formatted(ticker, limit=30) Sentiment analysis + samples str
get_klse_trade_details_formatted(ticker, limit=50) Volume breakdown str
get_klse_trade_summary_formatted(ticker) Bid/ask pressure str

Usage Examples

Async Usage

import asyncio
from klse_screener import get_klse_fundamentals

async def get_data():
    # Run sync function in thread pool
    data = await asyncio.to_thread(get_klse_fundamentals, "5132.KL")
    return data

asyncio.run(get_data())

Batch Processing

from concurrent.futures import ThreadPoolExecutor
from klse_screener import get_klse_fundamentals

stocks = ["5132.KL", "7152.KL", "9172.KL"]

with ThreadPoolExecutor(max_workers=5) as executor:
    results = list(executor.map(get_klse_fundamentals, stocks))

for stock, data in zip(stocks, results):
    print(f"{stock}: P/E={data.get('pe_ratio')}")

Error Handling

from klse_screener import get_klse_fundamentals

data = get_klse_fundamentals("5132.KL")
if "error" in data:
    print(f"Error: {data['error']}")
else:
    print(f"Success: {data}")

Rate Limiting

  • 2-second interval between requests (enforced globally)
  • 10 requests/minute maximum
  • Automatic backoff on errors

Ticker Format

KLSE tickers use the format {code}.KL:

  • 5132.KL - Deleum Berhad
  • 7152.KL - Yinson Holdings
  • 9172.KL - FPI Corporation

Non-KLSE tickers return empty results (no-op).

Limitations

  • 15-minute delayed trading data (per Bursa Malaysia regulations)
  • Market sentiment function has limited data (KLSE Screener removed some widgets)
  • HTML parsing - may break if KLSE Screener changes layout

License

MIT License - see LICENSE file.

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Run tests: pytest tests/
  5. Submit a pull request

Development

# Install dev dependencies
pip install -e ".[dev]"

# Run tests
pytest tests/ -v

# Run linting
ruff check src/ tests/

Changelog

0.1.0 (2026-04-21)

  • Initial release
  • 17 data functions extracted from FinGenius
  • Rate-limited HTTP client
  • Market detection utility

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

klse_screener_py-3.2.0.tar.gz (41.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

klse_screener_py-3.2.0-py3-none-any.whl (36.0 kB view details)

Uploaded Python 3

File details

Details for the file klse_screener_py-3.2.0.tar.gz.

File metadata

  • Download URL: klse_screener_py-3.2.0.tar.gz
  • Upload date:
  • Size: 41.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for klse_screener_py-3.2.0.tar.gz
Algorithm Hash digest
SHA256 ca2842acff5c06a9336eed2639f92e74cf4e21747a0ca2bd8d6dc2267be90842
MD5 2818719ecb28f889edbf2468eb71b411
BLAKE2b-256 8dc1c1a519234cd27b98e2d570237e8dc9d0d16fa43bba4d748cda06c120e7e7

See more details on using hashes here.

File details

Details for the file klse_screener_py-3.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for klse_screener_py-3.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ad47b39e0b252525073f3e097b5215b831df4da03ab8c01dd1b307b3e4a441ad
MD5 f96ac4ff1a6230d82c0aea92d1f05748
BLAKE2b-256 54705246aed10e5db40a2f74abcd4e20eefbccdad3f591c77588416cf9407467

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page