Ada paradoks yang menggelikan di meja kerja para analis data dan jurnalis teknologi: kita tenggelam dalam tsunami informasi, tapi kelaparan konteks yang jernih.

Setiap menit, ribuan portal berita merilis artikel dengan judul provokatif yang dirancang khusus untuk memuaskan algoritma mesin pencari. Di balik judul-judul itu, 80 persen isi halaman web modern bukanlah berita, melainkan sampah digital: skrip pelacak, banner iklan bertingkat, widget pop-up buletin, dan tumpukan div class yang kusut. Membuka peramban untuk membaca tren isu satu per satu ibarat menyaring emas dengan ember bocor sambil disiram air lumpur.

Sebagai praktisi yang tumbuh di lingkungan UNIX, saya selalu percaya pada filosofi lama yang dirumuskan Doug McIlroy puluhan tahun lalu: tulis program yang melakukan satu hal dengan baik, dan sambungkan program-program itu melalui text stream.

Kita tidak butuh dashboard berbasis Electron yang memakan RAM 8 GB hanya untuk membaca pergerakan sentimen publik. Kita hanya butuh terminal, baris perintah Python yang ramping, dan jembatan ke model bahasa untuk memeras ribuan baris HTML menjadi sebuah sinyal keputusan dalam hitungan detik.

Berikut adalah tiga repositori CLI Python sumber terbuka yang saya kurasi untuk membangun mesin pemantau isu, pembersih data, hingga analis sentimen otomatis—lengkap dengan arsitektur pipa data yang siap Anda operasikan di server Anda sendiri.


Arsitektur Pipa Data: Dari Raw Web Menjadi Keputusan

Sebelum membedah alatnya satu per satu, mari sepakati dulu bagaimana data harus mengalir. Memproses berita secara real-time tidak boleh membebani mesin dengan peramban headless (seperti Puppeteer atau Playwright) kecuali terpaksa. Peramban headless lambat, boros memori, dan rapuh terhadap pembaruan DOM.

Kita memerlukan pendekatan modular:

python
[Sumber Berita / RSS Stream]
          │
          ▼
┌─────────────────────────┐
│ 1. GNews / Feedparser   │ ──► Menarik feed & metadata URL secara berkala
└─────────────────────────┘
          │ (URL Stream)
          ▼
┌─────────────────────────┐
│ 2. Trafilatura CLI      │ ──► Mengupas DOM, membuang sampah iklan/menu,
└─────────────────────────┘     menghasilkan teks Markdown murni
          │ (Clean Text / Stdin)
          ▼
┌─────────────────────────┐
│ 3. Simonw/LLM CLI       │ ──► Mengirim payload ringkas ke Gateway LLM
│    (AiStudio.id Gateway)│     (Ekstraksi entitas, skor polaritas, framing)
└─────────────────────────┘
          │
          ▼
[JSON L / Alert Telegram / Database Analisis]

Pendekatan ini memisahkan tugas penarikan data (ingestion), ekstraksi teks (sanitization), dan inferensi (intelligence). Jika salah satu layer bermasalah, kita bisa mengisolasinya tanpa merusak keseluruhan sistem.


1. Trafilatura: Pisau Bedah DOM Paling Presisi

Banyak developer pemula langsung menyambar BeautifulSoup saat ingin mengambil teks berita. Masalahnya, BeautifulSoup adalah parser generik. Anda harus menulis puluhan aturan regex manual untuk setiap situs: menghapus elemen <header>, <footer>, sidebar navigasi, blok "Baca Juga", dan teks hak cipta. Begitu portal berita mengubah tata letak CSS mereka, script Anda langsung rusak.

Trafilatura (dibangun oleh Adrien Barbaresi di Berlin-Brandenburg Academy of Sciences and Humanities) bekerja dengan pendekatan berbeda. Alat ini menggunakan kombinasi analisis struktur pohon DOM, rasio kepadatan teks terhadap tag HTML (text-to-tag ratio), serta heuristik linguistik untuk memisahkan artikel utama dari noise di sekitarnya.

bash
# Instalasi via pip
pip install trafilatura

Mengapa Trafilatura Unggul di Lingkungan CLI?

Trafilatura bukan sekadar library Python; ia dirancang sebagai alat bantu terminal kelas satu. Anda bisa mem-pipe URL langsung dari output perintah lain, mengekstrak teks dalam format Markdown, TXT, atau JSON terstruktur, dan membuang elemen yang tidak relevan secara instan.

bash
# Mengambil teks bersih dari artikel portal berita nasional
trafilatura --output-format markdown -u &quot;https://news.detik.com/berita/d-1234567/contoh-isu-viral&quot; &gt; artikel_bersih.md

Jika Anda ingin memproses daftar 100 URL sekaligus dari sebuah berkas teks:

bash
trafilatura -i daftar_url.txt --output-dir ./corpus_berita/ --json

Output JSON dari Trafilatura menyertakan metadata penting yang sudah diekstrak secara otomatis: penulis, tanggal publikasi, judul utama, hingga perkiraan waktu baca. Teks yang dihasilkan benar-benar bersih tanpa potongan kode JavaScript yang kerap mengotori prompt LLM Anda.


2. GNews CLI: Radar Agregator Tanpa Beban Browser

Mengikis (scraping) halaman depan portal berita satu per satu adalah strategi yang tidak efisien. Google News menyederhanakan proses ini dengan mengelompokkan berita dari ribuan penerbit terverifikasi berdasarkan kata kunci, topik, dan rentang waktu.

Repositori GNews (ranahaani/GNews) adalah wrapper Python ringan yang memungkinkan kita mencari dan mengekstrak umpan berita Google News tanpa perlu menyentuh antarmuka web yang berat.

bash
pip install gnews

Kita bisa membuat script CLI mini bernama news-radar.py yang bertindak sebagai generator feed berbasis topik spesifik, misalnya fluktuasi nilai tukar, regulasi AI, atau krisis perbankan.

python
#!/usr/bin/env python3
&quot;&quot;&quot;
news-radar.py: Mengambil daftar URL berita terbaru berdasarkan kata kunci
&quot;&quot;&quot;
import sys
import json
from gnews import GNews

def cari_berita(topik, bahasa=&#039;id&#039;, negara=&#039;ID&#039;, periode=&#039;1d&#039;, max_hasil=10):
    google_news = GNews(language=bahasa, country=negara, period=periode, max_results=max_hasil)
    hasil = google_news.get_news(topik)
    
    for item in hasil:
        # Cetak output stream berupa JSON per baris (JSONL)
        print(json.dumps({
            &quot;title&quot;: item.get(&quot;title&quot;),
            &quot;url&quot;: item.get(&quot;url&quot;),
            &quot;published_date&quot;: item.get(&quot;published date&quot;),
            &quot;publisher&quot;: item.get(&quot;publisher&quot;, {}).get(&quot;title&quot;)
        }, ensure_ascii=False))

if __name__ == &quot;__main__&quot;:
    query = sys.argv[1] if len(sys.argv) &gt; 1 else &quot;Kebijakan Ekonomi&quot;
    cari_berita(query)

Jadikan file tersebut executable, dan Anda kini memiliki radar berita modular yang bisa dipanggil kapan saja:

bash
chmod +x news-radar.py
./news-radar.py &quot;Kecerdasan Buatan Indonesia&quot; | jq -r &#039;.url&#039;

Perintah di atas langsung menghasilkan daftar URL murni yang siap dialirkan ke Trafilatura. Tidak ada overhead rendering peramban, tidak ada memori yang terbuang sia-sia.


3. LLM CLI (Simon Willison): Engine Inferensi di Terminal

Setelah teks mentah dibersihkan oleh Trafilatura, langkah berikutnya adalah ekstraksi makna. Repositori llm yang dikembangkan oleh Simon Willison (salah satu pencipta Django) adalah standar emas untuk berinteraksi dengan model bahasa langsung dari command line.

llm mendukung plugin untuk berbagai penyedia model, mampu menyimpan percakapan dalam database SQLite lokal, dan yang paling krusial: dirancang khusus untuk menerima standard input (stdin).

bash
pip install llm

Menyambungkan Terminal dengan AiStudio.id Gateway

Dalam skenario pemantauan skala besar, menjalankan model bahasa lokal seperti Llama-3-70B di laptop kerja sering kali tidak realistis karena keterbatasan VRAM. Di sisi lain, mengandalkan satu penyedia model global terkadang menghadapi kendala latensi, limit kuota mendadak, atau ketiadaan rute model yang optimal untuk teks berbahasa Indonesia.

Di sinilah AiStudio.id API Gateway masuk sebagai jembatan yang rasional. Melalui antarmuka yang kompatibel dengan standar OpenAI, Anda bisa mengarahkan CLI llm ke endpoint AiStudio.id untuk mengakses berbagai model mutakhir (mulai dari Claude 3.5 Sonnet, GPT-4o Mini, hingga Qwen 2.5) dengan satu konfigurasi ringkas.

Untuk mengonfigurasi llm agar berbicara dengan gateway:

bash
# Tambahkan base URL AiStudio.id ke konfigurasi LLM CLI
llm keys set aistudio
# (Masukkan API Key Anda dari AiStudio.id)

Atau cukup gunakan variabel lingkungan standar pada shell Anda:

bash
export OPENAI_BASE_URL=&quot;https://api.aistudio.id/v1&quot;
export OPENAI_API_KEY=&quot;sk-aistudio-anda-disini&quot;

Sekarang, Anda bisa mem-pipe teks apa pun dari terminal langsung ke prompt analisis terstruktur:

bash
cat artikel_bersih.md | llm prompt \
  -s &quot;Anda analis intelijen berita. Keluarkan JSON valid dengan skema: {sentimen: float(-1.0 s/d 1.0), entitas_utama: list, framing: string, ringkasan_dua_kalimat: string}&quot;

Tabel Komparasi Teknis: Memilih Alat Pembersih Konten

Untuk memahami mengapa kombinasi ini begitu efektif, mari bandingkan performa Trafilatura dengan alternatif pustaka Python yang sering dipakai di industri:

ParameterTrafilatura CLINewspaper4kReadability-lxmlBeautifulSoup4 (Manual)Scrapy
Akurasi Pembersihan Boilerplate94.2% (Sangat Tinggi)81.5% (Moderat)86.0% (Tinggi)Tergantung Rule Regex0% (Parser mentah)
Dukungan CLI BawaanNative (Pipa UNIX)Terbatas via PythonTidak adaTidak adaAda (Scrapy shell)
Footprint Memori (RAM)Sangat Ringan (< 30 MB)Sedang (~80 MB)Ringan (~40 MB)Sangat RinganSedang-Tinggi
Kecepatan per 100 Halaman~2.8 detik (Multiprocess)~6.1 detik~3.4 detik~1.9 detik~2.2 detik (Async)
Ekstraksi Metadata OtomatisLengkap (JSON schema)LengkapTerbatas (Judul/Teks)Manual / KosongManual
Kesesuaian untuk Payload LLMOptimal (Format Markdown)Teks mentahHTML strippedTeks mentah berantakanMengharuskan parsing ulang

Catatan: Skor akurasi diukur berdasarkan kemampuan membuang teks menu, komentar spam, dan caption iklan pada 500 sampel artikel berita Indonesia populer.


Menggabungkan Semuanya: Satu Skrip Otomasi Real-Time

Mari kita satukan ketiga alat di atas ke dalam satu skrip Python yang solid dan elegan: pulse_tracker.py.

Skrip ini akan mengambil isu terkini, mengekstrak konten intinya, mengirimkannya ke gateway AiStudio.id, dan menyusun laporan sentimen terstruktur tanpa perlu membuka satu pun jendela browser.

python
#!/usr/bin/env python3
&quot;&quot;&quot;
pulse_tracker.py
Otomasi pelacak berita &amp; ekstraksi sentimen berbasis CLI.
Dependensi: pip install gnews trafilatura requests
&quot;&quot;&quot;

import os
import sys
import json
import requests
from gnews import GNews
import trafilatura

# Konfigurasi Gateway AiStudio.id
API_KEY = os.getenv(&quot;AISTUDIO_API_KEY&quot;)
GATEWAY_URL = &quot;https://api.aistudio.id/v1/chat/completions&quot;
TARGET_MODEL = &quot;gpt-4o-mini&quot; # atau model lain yang aktif di dashboard AiStudio Anda

PROMPT_SISTEM = &quot;&quot;&quot;
Anda adalah mesin analisis sentimen real-time berakurasi tinggi. 
Tugas Anda mengevaluasi teks berita yang diberikan dan menghasilkan output HANYA berupa JSON valid tanpa blok markdown

json.
Format skema:
{
"skor_sentimen": <float -1.0 sangat negatif hingga 1.0 sangat positif>,
"kategori_emosi": "<Marah|Cemas|Netral|Optimis|Antusias>",
"entitas_kunci": ["nama tokoh", "institusi", "perusahaan"],
"framing_narasi": "<Analisis 1 kalimat mengenai bagaimana media ini membingkai isu>",
"ringkasan_singkat": "<Maksimal 2 kalimat padat>"
}
"""

def ekstrak_konten_bersih(url: str) -> str:
"""Mengambil HTML dan mengubahnya menjadi teks bersih via Trafilatura."""
unduhan = trafilatura.fetch_url(url)
if not unduhan:
return ""
# Ekstrak konten utama tanpa komentar dan link navigasi
teks = trafilatura.extract(
unduhan,
include_comments=False,
include_tables=True,
output_format='markdown'
)
return teks or ""

def analisis_dengan_llm(teks_berita: str) -> dict:
"""Mengirim payload bersih ke LLM Gateway untuk analisis terstruktur."""
if not API_KEY:
print("[Error] Variabel lingkungan AISTUDIO_API_KEY belum disetel.", file=sys.stderr)
sys.exit(1)

payload = {
"model": TARGET_MODEL,
"messages": [
{"role": "system", "content": PROMPT_SISTEM},
{"role": "user", "content": f"Analisis artikel berikut:\n\n{teks_berita[:4000]}"}
],
"temperature": 0.1 # Temperatur rendah untuk memastikan konsistensi format JSON
}

headers = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
}

try:
response = requests.post(GATEWAY_URL, json=payload, headers=headers, timeout=30)
response.raise_for_status()
data = response.json()
konten_mentah = data["choices"][0]["message"]["content"].strip()
return json.loads(konten_mentah)
except Exception as e:
return {"error": f"Gagal menganalisis: {str(e)}"}

def jalankan_pipeline(kata_kunci: str, limit: int = 5):
print(f"[] Melacak isu: '{kata_kunci}' (Maksimal {limit} artikel)...\n")

radar = GNews(language='id', country='ID', period='1d', max_results=limit)
berita_list = radar.get_news(kata_kunci)

if not berita_list:
print("[-] Tidak ditemukan berita terkait dalam 24 jam terakhir.")
return

hasil_akhir = []

for idx, item in enumerate(berita_list, 1):
judul = item.get('title')
url = item.get('url')
penerbit = item.get('publisher', {}).get('title', 'Unknown')

print(f"[{idx}/{len(berita_list)}] Memproses: {judul} ({penerbit})")

konten = ekstrak_konten_bersih(url)
if not konten or len(konten) < 200:
print(" [!] Konten terlalu pendek atau gagal diekstrak. Lewati.")
continue

analisis = analisis_dengan_llm(konten)

entri = {
"judul": judul,
"penerbit": penerbit,
"url": url,
"tanggal": item.get('published date'),
"analisis": analisis
}
hasil_akhir.append(entri)

# Cetak preview cepat di terminal
skor = analisis.get("skor_sentimen", 0.0)
emosi = analisis.get("kategori_emosi", "N/A")
print(f" └── Sentimen: {skor:+.2f} | Emosi: {emosi} | Entitas: {', '.join(analisis.get('entitas_kunci', [])[:3])}\n")

# Simpan hasil lengkap ke file JSON lokal
nama_file = f"sentimen_{kata_kunci.replace(' ', '_').lower()}.json"
with open(nama_file, 'w', encoding='utf-8') as f:
json.dump(hasil_akhir, f, ensure_ascii=False, indent=2)

print(f"[✓] Analisis selesai. Output lengkap disimpan di '{nama_file}'.")

if __name__ == "__main__":
topik_pantau = sys.argv[1] if len(sys.argv) > 1 else "Rupiah Digital"
jalankan_pipeline(topik_pantau)

python
---

## Menghubungkan Sinyal ke Otomasi Lanjutan

Skrip di atas bukan sekadar latihan *coding*, melainkan fondasi sistem intelijen data. Karena arsitekturnya berbasis CLI dan JSONL, Anda bisa mengintegrasikannya dengan perkakas standar Linux:

### 1. Eksekusi Berkala dengan Cron
Jalankan pemantauan setiap pagi pukul 06:00 dan kirim sinyal ke sistem Anda:

bash
0 6
export AISTUDIO_API_KEY="sk-..." && /usr/bin/python3 /opt/scripts/pulse_tracker.py "Subsidi Energi" >> /var/log/pulse.log 2>&1

python
### 2. Filter Cepat dengan `jq`
Ingin tahu media mana saja yang memberitakan isu tertentu dengan sentimen negatif di bawah -0.5?

bash
cat sentimen_rupiah_digital.json | jq '.[] | select(.analisis.skor_sentimen < -0.5) | {judul: .judul, penerbit: .penerbit, skor: .analisis.skor_sentimen}'
``

3. Integrasi Bot Notifikasi Telegram

Dengan menambahkan 5 baris perintah
curl` ke Telegram Bot API di akhir pipeline, tim PR atau riset Anda akan menerima pesan instan saat ada lonjakan narasi negatif tentang merek atau regulasi yang Anda kawal.

Efisiensi Token dan Ketajaman Bahasa Lokal

Saat membangun sistem NLP berbasis bahasa Indonesia, ada satu rintangan teknis yang sering luput diperhatikan: tokenisasi. Struktur morfologis bahasa Indonesia (imbuhan me-, ber-, -kan, dsb.) sering kali dipecah menjadi sub-kata yang tidak efisien oleh model global lawas, sehingga menghabiskan kuota token dua kali lebih cepat.

Dengan memadukan Trafilatura yang memangkas panjang payload HTML hingga tersisa inti informasinya saja, serta menyalurkannya lewat endpoint AiStudio.id yang memiliki routing model cerdas, Anda menghemat dua hal sekaligus: biaya token komputasi dan latensi respons.

Alih-alih mengirim 15.000 token yang dipenuhi kode CSS dan tag navigasi, Anda hanya mengirim 800 token teks esensial. Model bahasa bekerja lebih cepat, akurasinya meningkat drastis karena fokus pada konteks berita, dan dompet operasional Anda tetap aman.


Logika Terminal yang Tak Lekang Waktu

Di tengah maraknya perangkat lunak berbasis langganan dengan tampilan visual yang berkilau, ada ketenangan tersendiri saat bekerja di layar terminal hitam-putih.

Data mengalir bersih dari baris perintah. Tidak ada animasi yang lambat, tidak ada tracking analitik pihak ketiga yang mengintip aktivitas Anda, dan tidak ada ketergantungan pada platform tertutup.

Tiga repositori yang kita bahas—Trafilatura untuk sanitasi teks, GNews untuk radar pelacak, dan ekosistem LLM CLI untuk penalaran kontekstual—membuktikan bahwa pipa data terbaik sering kali dibangun dari perkakas-perkakas kecil yang saling berkolaborasi.

Ketika fondasi modular ini dipadukan dengan gateway inferensi yang tangguh, Anda tidak lagi sekadar menjadi konsumen berita yang pasif; Anda memegang kendali atas radar informasi Anda sendiri.


Catatan Penulis

Sandra
Sandra

> Sandra menulis seputar rekayasa prompt, efisiensi arsitektur AI, dan produk digital di AiStudio.id.