UNPKG

@cifumo/scraper-node

Version:

Sebuah Module Scraper yang dibuat oleh Sxyz dan SuzakuTeam untuk memudahkan penggunaan scraper di project ESM maupun CJS.

142 lines (130 loc) 4.39 kB
/* Thanks To Nazir! */ import axios from "axios"; import * as cheerio from "cheerio"; const game = { mlHeroDetails: async (heroName = "Layla") => { const url = `https://mobile-legends.fandom.com/wiki/${encodeURIComponent(heroName)}`; try { const { data } = await axios.get(url); const $ = cheerio.load(data); const title = $("h1.page-header__title").text().trim(); const role = $('div[data-source="role"] .pi-data-value').text().trim(); const speciality = $('div[data-source="specialty"] .pi-data-value') .text() .trim(); const lane = $('div[data-source="lane"] .pi-data-value').text().trim(); return { thanksTo: "Nazir", title, role, speciality, lane, }; } catch (error) { console.error("Gagal mengambil data:", error.message); return null; } }, mlHeroes: async (heroNames) => { try { let response = await axios.get( `https://mobile-legends.fandom.com/wiki/${heroNames}`, ); let $ = cheerio.load(response.data); let releaseDate = $('[data-source="release_date"] .pi-data-value') .text() .trim(); let role = $('[data-source="role"] .pi-data-value a').text().trim(); let specialty = $('[data-source="specialty"] .pi-data-value') .text() .trim(); let lane = $('[data-source="lane"] .pi-data-value a').text().trim(); let priceBP = $('[data-source="price"] .pi-data-value span') .first() .text() .trim(); let priceDiamond = $('[data-source="price"] .pi-data-value span') .last() .text() .trim(); let skillResource = $('[data-source="resource"] .pi-data-value a') .text() .trim(); let damageType = $('[data-source="dmg_type"] .pi-data-value a') .text() .trim(); let attackType = $('[data-source="atk_type"] .pi-data-value a') .text() .trim(); let durability = $('[data-source="durability"] .bar').text().trim(); let offense = $('[data-source="offense"] .bar').text().trim(); let controlEffects = $('[data-source="control effect"] .bar') .text() .trim(); let difficulty = $('[data-source="difficulty"] .bar').text().trim(); let heroNumber = $('[data-source="current_hero"]').text().trim(); let heroName = $('[data-source="current_hero"] b').text().trim(); let spotlight = $(".pi-item.pi-image a").attr("href"); let image = $(".pi-item.pi-image a img").attr("src"); return { heroName, heroNumber, releaseDate, role, specialty, lane, price: { battlePoints: priceBP, diamonds: priceDiamond }, skillResource, damageType, attackType, ratings: { durability, offense, controlEffects, difficulty, }, image, }; } catch (error) { if (error.response?.status === 404) { throw "Tidak Ada Hero Bernama " + heroNames + " Di Mobile Legends"; } else { throw "Terjadi Kesalahan: " + error.message; } } }, ffChar: async (charName) => { try { const { data } = await axios.get(`${BASE_URL}/wiki/Characters`); const $ = cheerio.load(data); const results = []; $("table tbody tr").each((_, el) => { const linkEl = $(el).find("td").first().find("a"); const name = linkEl.text().trim(); const href = linkEl.attr("href"); const imgEl = $(el).find("img"); let image = imgEl.attr("data-src") || imgEl.attr("src"); if (image?.startsWith("data:image")) { image = imgEl.attr("data-src"); } if (name && href && image) { results.push({ name, image: image.replace(/scale-to-width-down\/\d+/, "revision/latest"), page: BASE_URL + href, }); } }); const filtered = results.find((x) => x.name.toLowerCase() === charName.toLowerCase()) || results.find((x) => x.name.toLowerCase().includes(charName.toLowerCase()), ); return filtered || null; } catch (err) { console.error("Error while searching character:", err.message); return null; } }, }; export default game;