@yanamiku/wallpapers-search
Version:
Scraper untuk mengambil gambar dari wallpapers.com
93 lines (78 loc) • 3.16 kB
JavaScript
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 };