@kelvdra/scraper
Version:
A simple scraper by kelvdra.
55 lines (49 loc) • 2.58 kB
JavaScript
import axios from "axios"
import * as cheerio from "cheerio"
export async function ytStalk(username) {
try {
const { data } = await axios.get(`https://youtube.com/@${username}`);
const $ = cheerio.load(data);
const script = $('script').filter((i, el) => $(el).html().includes('var ytInitialData =')).html();
const jsonData = script.match(/var ytInitialData = (.*?);/);
if (!jsonData || !jsonData[1]) return { status: false, message: "Data tidak ditemukan" };
const parsed = JSON.parse(jsonData[1]);
const tabs = parsed.contents.twoColumnBrowseResultsRenderer.tabs;
const videos = [];
tabs?.[0]?.tabRenderer?.content?.sectionListRenderer?.contents?.forEach(item => {
item.itemSectionRenderer?.contents?.forEach(content => {
const items = content?.shelfRenderer?.content?.horizontalListRenderer?.items || [];
items.forEach(v => {
const vid = v.gridVideoRenderer;
if (vid) {
videos.push({
title: vid.title.simpleText,
published: vid.publishedTimeText?.simpleText,
views: vid.viewCountText?.simpleText,
duration: vid.thumbnailOverlays?.find(o => o.thumbnailOverlayTimeStatusRenderer)?.thumbnailOverlayTimeStatusRenderer?.text?.simpleText,
url: `https://youtube.com/watch?v=${vid.videoId}`,
thumbnail: vid.thumbnail.thumbnails[0].url
});
}
});
});
});
const header = parsed.header?.pageHeaderRenderer;
const meta = parsed.metadata?.channelMetadataRenderer;
return {
status: true,
creator: "@kelvdra/scraper",
username: header?.content?.pageHeaderViewModel?.metadata?.contentMetadataViewModel?.metadataRows?.[0]?.metadataParts?.[0]?.text?.content,
subscribers: header?.content?.pageHeaderViewModel?.metadata?.contentMetadataViewModel?.metadataRows?.[1]?.metadataParts?.[0]?.text?.content,
videos: videos.slice(0, 5),
avatar: header?.content?.pageHeaderViewModel?.image?.decoratedAvatarViewModel?.avatar?.avatarViewModel?.image?.sources?.[0]?.url,
description: meta?.description,
channelUrl: meta?.channelUrl
};
} catch (e) {
return {
status: false,
message: e.message
};
}
}