Cara Menganalisis Log Server dengan Python untuk SEO Teknis
Google Search Console menunjukkan sebagian kecil perilaku crawler. Satu-satunya sumber yang mencatat setiap kunjungan bot adalah log server. Di artikel ini kamu akan mengurai access.log dengan Python untuk menemukan URL yang menghabiskan crawl budget Googlebot.
Apa itu analisis log server?
Analisis log server adalah proses membaca catatan permintaan HTTP yang diterima web server, lalu menyaringnya untuk melihat bagaimana mesin pencari menjelajahi situs. Berbeda dengan alat crawler pihak ketiga, log menunjukkan perilaku nyata Googlebot: halaman mana yang dikunjungi, seberapa sering, dan respons apa yang diterima.
Temuan yang paling sering muncul adalah crawl budget yang terserap oleh URL berparameter, halaman redirect berantai, dan halaman error 404. Pelajari definisinya di dokumentasi Google tentang crawl budget.
Persiapan data log
Kamu butuh file log dalam format combined (default Apache dan Nginx), Python 3.9 ke atas, serta pustaka Pandas. Minta tim infrastruktur mengekspor log minimal 14 hari, dan pastikan IP pengunjung tidak tertutup oleh CDN atau proxy.
pip install pandas
Mengurai log ke DataFrame
Satu baris log berisi IP, waktu, metode, URL, status, ukuran, referer, dan user-agent. Regex berikut mengubahnya menjadi tabel, lalu menyaring baris yang user-agent-nya mengandung Googlebot.
import re
import pandas as pd
LOG = re.compile(
r'(?P<ip>\S+) \S+ \S+ \[(?P<time>[^\]]+)\] '
r'"(?P<method>\S+) (?P<url>\S+) \S+" (?P<status>\d{3}) (?P<bytes>\S+) '
r'"(?P<ref>[^"]*)" "(?P<ua>[^"]*)"'
)
rows = []
with open("access.log", encoding="utf-8", errors="ignore") as f:
for line in f:
m = LOG.match(line)
if m:
rows.append(m.groupdict())
df = pd.DataFrame(rows)
df["time"] = pd.to_datetime(df["time"], format="%d/%b/%Y:%H:%M:%S %z")
df["status"] = df["status"].astype(int)
bot = df[df["ua"].str.contains("Googlebot", case=False)].copy()
print(f"{len(bot):,} hit Googlebot dari {len(df):,} baris log")
Verifikasi Googlebot asli
User-agent mudah dipalsukan. Sebelum menganalisis, pastikan IP benar-benar milik Google dengan reverse DNS lalu forward DNS, sesuai panduan verifikasi Googlebot.
import socket
from functools import lru_cache
@lru_cache(maxsize=None)
def is_real_googlebot(ip: str) -> bool:
try:
host = socket.gethostbyaddr(ip)[0]
if not host.endswith((".googlebot.com", ".google.com")):
return False
return ip in socket.gethostbyname_ex(host)[2]
except (socket.herror, socket.gaierror):
return False
bot = bot[bot["ip"].map(is_real_googlebot)]
Tips performa: verifikasi cukup dilakukan sekali per IP unik, karena itu fungsi di atas memakai cache. Pada log besar, jalankan hanya untuk IP yang unik, bukan untuk setiap baris.
Menemukan pemborosan crawl budget
Setelah data bersih, ukur tiga hal: sebaran status code, direktori yang paling sering dijelajahi, dan porsi hit yang jatuh ke URL berparameter atau respons non-200.
bot["path"] = bot["url"].str.split("?").str[0]
bot["has_param"] = bot["url"].str.contains(r"\?", regex=True)
bot["section"] = "/" + bot["path"].str.split("/").str[1]
# 1. Sebaran status code
print(bot["status"].value_counts(normalize=True).mul(100).round(1))
# 2. Direktori yang paling sering di-crawl
print(bot["section"].value_counts().head(10))
# 3. Estimasi crawl budget terbuang
waste = bot[(bot["status"] >= 300) | bot["has_param"]]
print(f"Crawl terbuang: {len(waste) / len(bot):.1%}")
Dari temuan ke tindakan
Angka saja belum berguna sebelum diterjemahkan menjadi perbaikan. Berikut pedoman cepat untuk membaca hasilnya:
| Temuan | Dampak | Tindakan |
|---|---|---|
| Hit 404 tinggi | Crawl terbuang ke halaman mati | Perbaiki link internal atau redirect 301 ke padanan terdekat |
| Rantai redirect 301/302 | Satu halaman memakan beberapa hit | Perbarui link internal langsung ke URL final |
| URL berparameter dominan | Duplikasi dan crawl berlebihan | Canonical, aturan robots.txt, atau penataan faceted navigation |
| Halaman penting jarang di-crawl | Indeksasi lambat | Perkuat link internal dan sertakan di sitemap XML |
Ulangi analisis 2 sampai 4 minggu setelah perbaikan dan bandingkan persentase crawl terbuang. Penurunan konsisten adalah bukti terukur bahwa optimasi berhasil.
Pertanyaan umum
Apakah analisis log server wajib untuk semua website?
Tidak wajib, tetapi sangat berguna untuk situs dengan ribuan URL atau lebih, seperti media, e-commerce, dan portal. Pada situs kecil, laporan Crawl Stats di Google Search Console biasanya sudah cukup.
Mengapa harus memverifikasi Googlebot lewat reverse DNS?
Banyak bot menyamar sebagai Googlebot lewat user-agent. Verifikasi reverse DNS dan forward DNS memastikan data yang kamu analisis benar-benar berasal dari Google.
Berapa lama data log yang ideal dianalisis?
Minimal 14 hari agar pola harian dan mingguan terlihat. Untuk situs besar, 30 hari memberi gambaran yang lebih stabil.