Sistem web scraping otomatis untuk mengekstrak data nilai gizi dari nilaigizi.com.
β¨ Baru! Logika parsing yang lebih akurat berdasarkan struktur HTML aktual dari nilaigizi.com
- Two-Phase Scraping: Crawling URLs kemudian ekstraksi data detail
- Accurate HTML Parsing: Ekstraksi data dari tabel HTML menggunakan BeautifulSoup
- CSV Export: Output data dalam format CSV yang mudah dianalisis
- Rate Limiting: Penundaan otomatis untuk menghindari overload server
- Error Handling: Penanganan error yang robust untuk koneksi dan parsing
- Tested & Validated: Sudah ditest dengan data real dari website
Untuk setiap produk, scraper mengekstrak:
- Nama Produk
- URL Produk
- Energi (kkal)
- Protein (g)
- Karbohidrat Total (g)
- Lemak Total (g)
- Python 3.x
- requests - HTTP client
- BeautifulSoup4 - HTML parsing
- pandas - Data manipulation & CSV export
- re - Regular expressions untuk text extraction
nilaigizi/
βββ src/
β βββ __init__.py
β βββ scraper.py # Main scraping logic
β βββ config.py # Configuration settings
βββ data/ # Output CSV files
β βββ .gitkeep
βββ requirements.txt # Python dependencies
βββ README.md # Dokumentasi
βββ .gitignore # Git ignore rules
cd /path/to/nilaigizipython -m venv venv
# Aktivasi virtual environment
# Linux/Mac:
source venv/bin/activate
# Windows:
venv\Scripts\activatepip install -r requirements.txtpython -m src.scraperEdit file src/config.py untuk mengubah pengaturan:
# Jumlah halaman yang akan di-scrape
TOTAL_PAGES = 5 # Ubah ke 149 untuk full scrape
# Lokasi output file
OUTPUT_FILENAME = "data/data_nilai_gizi.csv"
# Delay antara request (detik)
MIN_DELAY = 0.5
MAX_DELAY = 1.5from src.scraper import NilaigizScraper
# Initialize scraper
scraper = NilaigizScraper(max_pages=10)
# Run full pipeline
scraper.run()
# Atau jalankan step-by-step
urls = scraper.get_product_urls()
data = scraper.scrape_product_details(urls)
scraper.save_to_csv("custom_output.csv")Jika ingin scrape semua data:
- Ubah
TOTAL_PAGESdi config.py menjadi 149 - Pertimbangkan optimasi:
- Data gizi sudah tersedia di halaman pencarian (list view)
- Ekstrak langsung dari list view untuk menghindari 3000+ requests
- Total request: 149 (list pages) vs 149 + ~3000 (detail pages)
- 5 halaman (default): ~2-5 menit
- 149 halaman (crawl only): ~2-3 jam
- 149 halaman + detail pages: ~10-15 jam
- β Gunakan untuk tujuan penelitian atau personal
- β Respect robots.txt dari website
- β Rate limiting sudah diimplementasikan
- β Jangan overload server target
- β Jangan untuk tujuan komersial tanpa izin
Jika menemukan error:
- Connection Error: Periksa koneksi internet
- HTTP 403/429: Server memblokir request, tingkatkan delay
- Parsing Error: Struktur HTML website mungkin berubah
- Empty Data: Verifikasi selector CSS di
scraper.py
-
Jalankan test parser terlebih dahulu:
python test_parser.py
Ini akan memvalidasi logika parsing dengan sample HTML
-
Buka URL di browser dan periksa HTML structure
-
Update selector CSS di method
scrape_product_details()jika struktur berubah -
Verifikasi selector di
src/scraper.py:- Nama produk:
span.h5 - Tabel gizi:
tbody.f11
- Nama produk:
- Tingkatkan
MIN_DELAYdanMAX_DELAYdisrc/config.py - Update
User-Agentheader di config - Gunakan proxy atau VPN
Untuk memverifikasi parsing bekerja dengan benar:
# Run test dengan sample HTML
python test_parser.py
# Expected output:
# β Nama Produk: Adem sari herbal lemon
# β Energi: 60.0 kkal
# β Protein: 0.0 g
# β Karbohidrat: 16.0 g
# β Lemak: 0.0 g
# π SEMUA TEST PASSED!File CSV yang dihasilkan:
| Nama Produk | URL | Energi | Protein | Karbohidrat | Lemak |
|---|---|---|---|---|---|
| Apel Merah | https://... | 52.00 | 0.30 | 13.80 | 0.20 |
| Nasi Putih | https://... | 130.00 | 2.70 | 28.20 | 0.30 |
Contributions are welcome! Silakan buat pull request atau buka issue untuk bug reports dan feature requests.
This project is provided as-is for educational purposes.
Disclaimer: Proyek ini dibuat untuk tujuan edukasi. Pastikan untuk mematuhi Terms of Service dari website target.