SEO Teknis

Cara Menganalisis Log Server dengan Python untuk SEO Teknis

Oleh Kevin YogaTerbit Diperbarui 3 menit baca
Analisis log server website 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.

Baca juga