UNPKG

@suzakuteam/scraper-node

Version:

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

135 lines (122 loc) 3.94 kB
import axios from "axios"; import * as cheerio from "cheerio"; import { log } from "../lib/logger.js"; import { Success, ErrorResponse } from "./lib/function.js"; const news = { validNews: { terkini: async () => { const { data } = await axios.get( "https://dot-portal.validvisi.com//api/portal/home/terkini", ); return { success: true, beritaTerkini: data.data, }; }, populer: async () => { const randomIndex = Math.floor(Math.random() * 100) + 1; const { data } = await axios.get( `https://dot-portal.validvisi.com//api/portal/home/populer?page=${randomIndex}`, ); return { success: true, page: randomIndex, beritaPopuler: data.data, }; }, nasional: async () => { const randomIndex = Math.floor(Math.random() * 100) + 1; const { data } = await axios.get( `https://dot-portal.validvisi.com//api/portal/home/nasional?page=${randomIndex}`, ); return { success: true, page: randomIndex, beritaNasional: data.data, }; }, search: async (q) => { const payload = { end_date: "", search: q, start_date: "", }; const { data } = await axios.post( "https://dot-portal.validvisi.com//api/portal/news/search?page=1", payload, ); return { success: true, jumlahSearchingBerita: data.data.result.length, hasilPencarian: data.data.result, }; }, }, detik: { hotNews: async () => { const { data } = await axios.get("https://news.detik.com/"); const $ = cheerio.load(data); const newsList = []; $("article.list-content__item.column").each((_, el) => { const title = $(el).find("h2.media__title a").text().trim(); const link = $(el).find("a.media__link").attr("href"); const image = $(el).find("img").attr("src"); newsList.push({ title, link, image }); }); return new Success(newsList); }, search: async (q) => { const { data } = await axios.get( `https://www.detik.com/search/searchall?query=${encodeURIComponent(q)}`, ); const $ = cheerio.load(data); const results = []; $("article.list-content__item").each((_, el) => { const title = $(el).find("h3.media__title a").text().trim(); const link = $(el).find("h3.media__title a").attr("href"); const image = $(el).find("img").attr("src"); const description = $(el).find("div.media__desc").text().trim(); const category = $(el).find("h2.media__subtitle").text().trim(); const date = $(el).find("div.media__date span").text().trim(); results.push({ title, link, image, description, category, date, }); }); return new Success(results); }, detail: async (url) => { if (!url) return log.message("Please send a link news"); try { const { data: detail } = await axios.get(url); const $ = cheerio.load(detail); const title = $("h1.detail__title").text().trim(); const author = $(".detail__author").text().trim(); const date = $(".detail__date").text().trim(); const image = $(".detail__media img").attr("src"); const caption = $(".detail__media-caption").text().trim(); let content = ""; $(".detail__body-text p").each((_, el) => { const paragraph = $(el).text().trim(); if (paragraph) content += paragraph + "\n\n"; }); return { title, author, date, image, caption, content: content.trim(), }; } catch (e) { console.error("Gagal mengambil detail berita:", e.message); return null; } }, }, }; export default news;