@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
JavaScript
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;