Scraping snippet DuckDuckGo + gambar Bing, export HTML berbasis Blade (.blade.php7).
php -v).win\setup.bat) sekali di awal.duck-scraper/
├─ composer.json
├─ config.json
├─ convert.cmd ← convert keywords → sqlite (insert-or-ignore)
├─ scrape.cmd ← scraping (gambar → artikel)
├─ export.cmd ← export HTML + sitemap
├─ clean.cmd ← hapus cache+export+db (tanpa konfirmasi)
├─ keywords/ ← taruh file .txt keyword (1 keyword per baris)
├─ sqlite/ ← database .sqlite (otomatis)
├─ export/ ← hasil export HTML (otomatis)
├─ writable/
│ └─ blade/
│ └─ theme/
│ ├─ layout.blade.php7
│ ├─ index.blade.php7
│ └─ article.blade.php7
└─ resources/tmp/cache/blade/ ← cache Blade
keywords/ (contoh: home garden.txt).convert
scrape
export
export/<nama-db>/ (mis. export/home-garden/).Membuat/menambah database dari semua file .txt di keywords/. Niche otomatis diisi dari nama file (yang juga jadi nama database). Duplikat keyword (berdasarkan slug) otomatis diabaikan.
convert
Urutan: scrape gambar semua keyword → lanjut scrape artikel (snippet DuckDuckGo). Default concurrency mengikuti config.json.
scrape :: semua database
scrape <db-name> [min] :: contoh: scrape home-garden 12
Hasilkan HTML (tanpa subfolder /p), index per grup, dan sitemap.xml. Related post disusun per grup dan mengikuti split.
export :: semua DB, split=true (default)
export <db-name> false :: export 1 DB tanpa split
Menghapus SEMUA: cache Blade + folder export + semua database sqlite. Tidak ada konfirmasi.
clean
.txt di folder keywords/, 1 keyword per baris.keywords/
└─ home garden.txt → sqlite/home-garden.sqlite (niche="home-garden")
convert lagi bila menambah keyword. Duplikat diabaikan (aman di-run berulang).config.json)concurrency: jumlah request paralel scraping artikel (default 5).min_results: minimal snippet per keyword (default 12). Sistem akan Next (POST) sampai batas waktu.duckduckgo.max_per_query_seconds: waktu maks per keyword (default 90 detik).images.max: jumlah maksimum gambar disimpan per artikel (default 8). images.concurrency = batch paralel gambar.export.grouping.size: maksimal artikel per grup saat split (default 500). Related post & sitemap mengikuti grup.export.templates.extensions berisi ["blade.php7"] agar template tidak ikut terenkripsi ionCube.domain (opsional): bila diisi, canonical URL & sitemap menggunakan domain absolut.File berada di writable/blade/theme/ dengan ekstensi .blade.php7. Nama view:
theme.layout → layout.blade.php7theme.index → index.blade.php7theme.article → article.blade.php7Variabel di view article:
TITLE, SLUG, DB_NAME, DESCRIPTION, CANONICAL_URLIMAGES (array: url,title,alt,source,domain,width,height,filetype)PARAGRAPHS (sudah diacak), PARAGRAPHS_ALL (urutan asli)RELATED (array: slug,title,url)Catatan: Export akan skip artikel yang tidak lengkap (harus ada gambar & paragraf).
Untuk menulis Blade lebih singkat, tersedia helper global:
paragraphs_pick(array $paragraphs, int $n=2, bool $shuffle=true, ?int $minLen=null, ?int $maxLen=null): arraytpl_pick(array $arr, int $n=2, bool $shuffle=true, ?int $minLen=null, ?int $maxLen=null): arraytpl_shuffled(array $arr): arraypickp(...) — alias singkat untuk paragraphs_pick@foreach($IMAGES as $img)
<img src="{{ $img['url'] }}" alt="{{ $img['alt'] ?? $TITLE }}" class="img-fluid rounded mb-2">
@foreach(paragraphs_pick($PARAGRAPHS_ALL, 2) as $p)
<p class="mb-2">{{ $p }}</p>
@endforeach
@endforeach
@foreach(paragraphs_pick($PARAGRAPHS_ALL, 3, true, 80, 300) as $p)
<p>{{ $p }}</p>
@endforeach
@foreach(tpl_pick($IMAGES, 4) as $img)
<img src="{{ $img['url'] }}" alt="{{ $img['alt'] ?? $TITLE }}" class="img-fluid">
@endforeach
export/<db>/<slug>.htmlexport/<db>/index.html, index-g2.html, dst.export/<db>/sitemap-g1.xml, dst.export/<db>/sitemap.xmldomain diisi): export/sitemap.xmlIndex & paragraf diacak saat export untuk variasi natural.
php ada di PATH (php -v).min_results, atau set proxy di config.json.duckduckgo.max_per_query_seconds.done (scrape gambar + artikel harus sukses)..blade.php7 & nama view cocok (theme.article → article.blade.php7).Q: Bisa tambah keyword ke DB yang sudah ada?
A: Ya. Jalankan convert lagi—sistem menambah keyword baru dan mengabaikan duplikat.
Q: Apa itu niche?
A: niche diisi dari nama file keywords. Dipakai untuk grouping/label di DB.
Q: Bagaimana menghapus semuanya?
A: Jalankan clean. Hati-hati, ini menghapus cache Blade, folder export, dan semua file .sqlite.
Q: Bisa export tanpa split?
A: Ya. export <db> false. Sitemap & related post mengikuti grup (tanpa split = 1 grup).