Sudah bukan rahasia kalau seorang SEO itu rutinitasnya berhadapan dengan repetitive task seperti ini:
Kamu ingin audit Core Web Vitals score ratusan, bahkan ribuan, halaman website-mu. Kamu harus membuka satu per satu URL di PageSpeed Insights, menunggu hasilnya, catat, lalu mengulangi prosesnya lagi untuk halaman yang berbeda.
Akibatnya? Waktu terbuang percuma, fokus terkuras, dan data yang terkumpul seringkali tidak konsisten.
Padahal, SEO modern sangat bergantung pada audit technical SEO, dan Google semakin menekankan kualitas user experience yang bisa kita metriks-kan pada Core Web Vitals score.
Seperti yang selalu saya advokasikan, potensi Python untuk SEO tasks itu sangat besar, demikian juga untuk task ini. Dengan mengkombinasikannya dengan PageSpeed Insights API, kita bisa mengefisiensikan proses ini!
1. Persiapan
Sebelum kita meluncurkan roket otomasi ini, ada beberapa "amunisi" yang perlu kamu siapkan.
-
Library
requests: Library ini adalah jembatan kita untuk "berbicara" dengan API Google. Cara install-nya gampang banget, buka terminal atau command prompt-mu, lalu ketik:pip install requests
Library ini adalah salah satu Python library paling fundamental untuk interaksi web (HTTP request).
-
Google API Key: Ini seperti kunci masukmu ke layanan Google PageSpeed Insights API. Kamu bisa mendapatkannya secara gratis dari Google Cloud Console. Kalau kamu bingung bagaimana caranya, panduan Google Cloud API ini bisa membantumu. Pastikan untuk mengaktifkan "PageSpeed Insights API" di konsolmu.
-
File Input
urls.txt: Buat sebuah file teks bernamaurls.txtdi folder yang sama dengan script Python-mu nanti. Isi file ini dengan daftar URL yang ingin kamu audit, satu URL per baris. Contohnya:https://www.dikgital.com https://www.dikgital.com/blog/ https://www.dikgital.com/service/
2. Bedah Fungsi Script: Mengungkap Cara Kerja Otomasi
Untuk file Pythonnya, kamu bisa unduh melalui repository Github-ku. Sekarang coba kita bedah satu-persatu fungsi-fungsi yang ada di script tersebut.
Fungsi Kategorisasi (categorize_lcp, categorize_inp, categorize_cls)
Tiga fungsi ini adalah benchmark untuk menilai performa setiap metrik Core Web Vitals dari sebuah website.
def categorize_lcp(lcp):
if lcp <= 2.5:
return "Good"
elif lcp <= 4.0:
return "Needs Improvement"
else:
return "Poor"
def categorize_inp(inp_ms):
if inp_ms is None:
return "Not Available"
if inp_ms <= 200:
return "Good"
elif inp_ms <= 500:
return "Needs Improvement"
else:
return "Poor"
def categorize_cls(cls):
if cls <= 0.1:
return "Good"
elif cls <= 0.25:
return "Needs Improvement"
else:
return "Poor"
Fungsi ini membandingkan nilai yang didapat dari API dengan ambang batas (threshold) resmi dari Google untuk menentukan apakah metrik tersebut masuk kategori "Good", "Needs Improvement", atau "Poor".
Ini adalah standar yang ditetapkan Google untuk metrik performa dan user experience. Contohnya, untuk LCP, nilai di bawah 2.5 detik dianggap "Good".
Fungsi Utama check_core_web_vitals
Inilah bagian yang berinteraksi langsung dengan API Google.
def check_core_web_vitals(api_key, url, strategy="mobile"):
endpoint = "https://www.googleapis.com/pagespeedonline/v5/runPagespeed"
params = {
"url": url,
"key": api_key,
"strategy": strategy,
"category": "performance"
}
Endpoint API: Fungsi ini mengakses Google PageSpeed V5 API. kamu bisa cek detailnya di dokumentasi PSI API. Secara proses, kita akan mengirimkan URL target dan API Key sebagai parameter.
strategy: 'mobile': Umumnya, audit website Core Web Vitals sangat fokus pada performa website di perangkat seluler karena dominasi pengguna mobile. Jadi, saya sengaja untuk mendesain script ini hanya akan memeriksa performa di mobile.
Field Data (CrUX) vs. Lab Data (Lighthouse): Ini poin penting dalam proses monitoring CWV. Script ini dirancang untuk memprioritaskan data lapangan dari CrUX (Chrome User Experience Report) yang merupakan data riil dari pengguna asli (Real User Monitoring).
# --- 1. Try CrUX (field data)
if "LARGEST_CONTENTFUL_PAINT_MS" in metrics_field:
lcp = metrics_field["LARGEST_CONTENTFUL_PAINT_MS"]["percentile"] / 1000
if "INTERACTION_TO_NEXT_PAINT" in metrics_field:
inp = metrics_field["INTERACTION_TO_NEXT_PAINT"]["percentile"]
elif "EXPERIMENTAL_INTERACTION_TO_NEXT_PAINT" in metrics_field:
inp = metrics_field["EXPERIMENTAL_INTERACTION_TO_NEXT_PAINT"]["percentile"]
if "CUMULATIVE_LAYOUT_SHIFT_SCORE" in metrics_field:
cls = metrics_field["CUMULATIVE_LAYOUT_SHIFT_SCORE"]["percentile"] / 100
CrUX API sendiri punya panduan yang bisa kamu explore lebih lanjut.
# --- 2. Fallback ke Lighthouse (lab data)
if not lcp or not inp or not cls:
audits = lighthouse.get("audits", {})
source = "Lab (Lighthouse)"
try:
if not lcp and "largest-contentful-paint" in audits:
lcp = audits["largest-contentful-paint"]["numericValue"] / 1000
if not inp and "interactive" in audits: # INP belum fully ada di Lighthouse, pakai TTI fallback
inp = audits["interactive"]["numericValue"]
if not cls and "cumulative-layout-shift" in audits:
cls = audits["cumulative-layout-shift"]["numericValue"]
except:
pass
Data CrUX ini bisa dianggap lebih akurat, karena merepresentasikan pengalaman nyata usermu. Jika data CrUX tidak tersedia (misalnya untuk URL yang jarang dikunjungi atau website yang relatif masih baru), script akan menggunakan data simulasi dari Lighthouse (Lab Data) sebagai cadangan.
Pengambilan Performance Score: Selain metrik individual CWV, script ini juga mengambil skor performa keseluruhan dari Lighthouse (0-100).
# Performance score (selalu dari lab)
perf_score = None
try:
perf_score = lighthouse["categories"]["performance"]["score"] * 100
except:
pass
return {
"URL": url,
"Data Source": source,
"Performance Score": perf_score,
"LCP (s)": round(lcp, 2) if lcp else None,
"LCP Category": categorize_lcp(lcp) if lcp else "Not Available",
"INP (ms)": round(inp) if inp else None,
"INP Category": categorize_inp(inp),
"CLS": round(cls, 3) if cls else None,
"CLS Category": categorize_cls(cls) if cls else "Not Available",
}
Penanganan Error: Penting untuk menambahkan try-except block untuk menangani kasus di mana ada masalah jaringan atau API mengembalikan error.
try:
perf_score = lighthouse["categories"]["performance"]["score"] * 100
except:
pass
Fungsi main:
Fungsi ini adalah orkestrator dari seluruh proses.
-
Membaca File Input:
mainakan membaca setiap baris dari fileurls.txtyang sudah kamu siapkan, mengumpulkan semua URL target.def main(): with open(INPUT_FILE, "r") as f: urls = [u.strip() for u in f if u.strip()] -
Rate Limiting (
time.sleep(1)): Google API memiliki batasan jumlah permintaan per waktu tertentu. Dengan menambahkantime.sleep(1)akan memberikan jeda 1 detik setiap 1request. Hal ini bisa membantu untuk mencegah API memblokir permintaan kita karena dianggap terlalu cepat. -
Ekspor Data ke CSV: Setelah semua URL diproses, hasilnya akan dikumpulkan dan disimpan dalam file
core_web_vitals_report.csv.# Save to CSV keys = results[0].keys() with open(OUTPUT_FILE, "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=keys) writer.writeheader() writer.writerows(results) print(f"\n✅ Done! Hasil tersimpan di {OUTPUT_FILE}")
3. Cara Penggunaan
Sekarang, setelah kamu tahu cara kerjanya, mari kita jalankan script-nya!
-
Konfigurasi: Buka file Python-mu, lalu ganti variabel
API_KEYdengan API Key Google-mu yang valid. Jangan sampai salah ya! -
Input URL: Pastikan file
urls.txtsudah ada di folder yang sama dengan script Python-mu dan berisi daftar URL target, satu URL per baris. Bila kamu ingin lebih yakin, kamu juga bisa menggunakanPATHdari file.txtmu itu, misal:r"D:\PYTHON SEO\PSI Audit\urls.txt" -
Eksekusi: Buka terminal atau command prompt-mu, navigasikan ke folder tempat script dan file
urls.txtberada, lalu jalankan perintah ini:python nama_script.py(Ganti
nama_script.pydengan nama file Python-mu, misalnyaaudit_cwb.py). -
Monitoring: Kamu akan melihat progres pengecekan muncul di terminal. Script akan memberitahumu URL mana yang sedang diproses.
Checking {url} ... -
Output: Setelah proses selesai, sebuah file baru bernama
core_web_vitals_report.csvakan muncul di folder yang sama. Buka file ini dengan program spreadsheet favoritmu (Excel, Google Sheets, LibreOffice Calc) untuk memulai analisis hasil report.
4. Rapikan Data untuk Mempermudah Analisa Hasil Report
Selamat! Kamu sudah memiliki laporan Core Web Vitals untuk daftar URL kamu yang melebihi daftar anggaran belanja negara.
Kalau ingin meniru langkah saya, kamu bisa copy + paste data output .csvmu ini ke Google Sheet, kemudian rapikan header dan conditional formatting setiap cell dari datamu, sehingga akan mempermudah proses "scanning"-mu pada ribuan data tersebut.

Berikut adalah kolom-kolom penting yang akan kamu temukan di file CSV-mu dan cara menganalisanya:
-
URL: Ini adalah alamat halaman yang kamu audit CWV. Identifikasi halaman mana yang menjadi fokus utama.
-
Data Source: Kolom ini sangat informatif! Ini memberitahumu apakah data CWV diambil dari pengguna asli (Field - CrUX) atau hasil simulasi (Lab - Lighthouse).
-
Performance Score: Ini adalah skor keseluruhan kesehatan halamanmu (0-100) dari Lighthouse. Score rendah berarti ada banyak pe-er!
-
LCP (ms) & LCP Category: Metrik Largest Contentful Paint menunjukkan waktu rendering elemen konten terbesar di halaman. Jika kategorinya "Poor" atau "Needs Improvement", lihat titik permasalahannya dimana, biasanya sih di image above the fold terbesar. Tapi bisa juga elemen lain seperti chunks JS.
-
INP (ms) & INP Category: Interaction to Next Paint mengukur responsivitas halaman terhadap interaksi pengguna. Jika ini "Poor", kemungkinan halamanmu kurang/tidak responsif saat user kamu ingin berpindah halaman, memencet button, atau sekedar scroll.
-
CLS & CLS Category: Cumulative Layout Shift mengukur stabilitas visual halaman. Pergeseran tata letak bisa sangat mengganggu user experience. Periksa apakah ada elemen yang tiba-tiba berubah saat halaman dimuat, seperti font load, gambar yang baru muncul belakangan sehingga halaman terkesan "melorot", dll.
Metrik & Kategori ini memudahkanmu identifikasi cepat halaman mana yang perlu diperbaiki berdasarkan status "Poor" atau "Needs Improvement". Prioritaskan halaman dengan kategori "Poor" di ketiga metrik, terutama yang menggunakan "Field (CrUX)" sebagai sumber datanya, karena ini adalah sinyal langsung dari algoritma Google bahwa ada masalah performa website yang serius.
Selamat mencoba otomasi audit Core Web Vitals ini! Dengan script Python ini, kamu bukan hanya menghemat waktu, tapi kamu juga akan mendapatkan data SEO yang lebih akurat.




