UNPKG

@yanamiku/wallpapers-search

Version:

Scraper untuk mengambil gambar dari wallpapers.com

93 lines (78 loc) 3.16 kB
const axios = require("axios"); const cheerio = require("cheerio"); async function searchWallpapers(query, amount) { try { if (!query) { throw new Error('Format salah. Gunakan: searchWallpapers("kata kunci", jumlah). Contoh: searchWallpapers("nakano miku", 5)'); } const fetchPageData = async (query, page = 1) => { try { const searchUrl = `https://wallpapers.com/search/${encodeURIComponent(query)}?p=${page}`; const response = await axios.get(searchUrl); const $ = cheerio.load(response.data); const htmlUrls = []; $('a').each((_, element) => { const href = $(element).attr("href"); if (href && href.endsWith(".html")) { htmlUrls.push(href.startsWith("http") ? href : `https://wallpapers.com${href}`); } }); return htmlUrls; } catch (error) { throw new Error(`Gagal mengambil halaman pencarian: ${error.message}`); } }; let htmlUrls = []; let page = 1; let hasMorePages = true; while (hasMorePages && (!amount || htmlUrls.length < amount)) { const pageData = await fetchPageData(query, page); htmlUrls = htmlUrls.concat(pageData); if (pageData.length < 40) { hasMorePages = false; // Tidak ada halaman selanjutnya } page++; } if (htmlUrls.length === 0) { throw new Error(`Tidak ada hasil ditemukan untuk kata kunci: "${query}".`); } const selectedHtmlUrls = amount ? htmlUrls.slice(0, amount) : htmlUrls; const imageUrls = []; for (const url of selectedHtmlUrls) { try { const pageResponse = await axios.get(url); const $$ = cheerio.load(pageResponse.data); const firstImage = $$("img") .map((_, element) => { const src = $$(element).attr("src"); if (src && /\.(jpg|jpeg|png)$/i.test(src)) { return src.startsWith("http") ? src : `https://wallpapers.com${src}`; } }) .get(0); if (firstImage) { imageUrls.push(firstImage); } } catch (err) { console.warn(`Gagal mengambil gambar dari: ${url} - ${err.message}`); } } if (imageUrls.length === 0) { throw new Error(`Gagal menemukan gambar untuk kata kunci: "${query}".`); } return { status: true, author: "© YanaMiku - Iyuzaki Yanagi", query, totalImage: imageUrls.length, imageUrl: imageUrls }; } catch (error) { return { status: false, author: "© YanaMiku - Iyuzaki Yanagi", message: error.message }; } } module.exports = { searchWallpapers };