feat(parser): added home page parser
This commit is contained in:
@@ -0,0 +1,183 @@
|
|||||||
|
import axios, { AxiosError } from "axios";
|
||||||
|
import { load, CheerioAPI, SelectorType } from "cheerio";
|
||||||
|
import {
|
||||||
|
SRC_HOME_URL,
|
||||||
|
ACCEPT_HEADER,
|
||||||
|
USER_AGENT_HEADER,
|
||||||
|
ACCEPT_ENCODING_HEADER,
|
||||||
|
extractTop10Animes,
|
||||||
|
extractAnimes,
|
||||||
|
} from "../utils";
|
||||||
|
|
||||||
|
import createHttpError, { HttpError } from "http-errors";
|
||||||
|
import { ScrapedHomePage } from "../models";
|
||||||
|
|
||||||
|
// /anime/home
|
||||||
|
async function scrapeHomePage(): Promise<ScrapedHomePage | HttpError> {
|
||||||
|
const res: ScrapedHomePage = {
|
||||||
|
spotlightAnimes: [],
|
||||||
|
trendingAnimes: [],
|
||||||
|
latestEpisodeAnimes: [],
|
||||||
|
topUpcomingAnimes: [],
|
||||||
|
top10Animes: {
|
||||||
|
today: [],
|
||||||
|
week: [],
|
||||||
|
month: [],
|
||||||
|
},
|
||||||
|
topAiringAnimes: [],
|
||||||
|
genres: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
const mainPage = await axios.get(SRC_HOME_URL as string, {
|
||||||
|
headers: {
|
||||||
|
"User-Agent": USER_AGENT_HEADER,
|
||||||
|
"Accept-Encoding": ACCEPT_ENCODING_HEADER,
|
||||||
|
Accept: ACCEPT_HEADER,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const $: CheerioAPI = load(mainPage.data);
|
||||||
|
|
||||||
|
const spotlightSelector: SelectorType =
|
||||||
|
"#slider .swiper-wrapper .swiper-slide";
|
||||||
|
|
||||||
|
$(spotlightSelector).each((i, el) => {
|
||||||
|
const otherInfo = $(el)
|
||||||
|
.find(".deslide-item-content .sc-detail .scd-item")
|
||||||
|
.map((i, el) => $(el).text().trim())
|
||||||
|
.get();
|
||||||
|
|
||||||
|
res.spotlightAnimes.push({
|
||||||
|
rank:
|
||||||
|
Number(
|
||||||
|
$(el)
|
||||||
|
.find(".deslide-item-content .desi-sub-text")
|
||||||
|
?.text()
|
||||||
|
.trim()
|
||||||
|
.split(" ")[0]
|
||||||
|
.slice(1)
|
||||||
|
) || null,
|
||||||
|
id: $(el)
|
||||||
|
.find(".deslide-item-content .desi-buttons a")
|
||||||
|
?.last()
|
||||||
|
?.attr("href")
|
||||||
|
?.slice(1)
|
||||||
|
?.trim(),
|
||||||
|
name: $(el)
|
||||||
|
.find(".deslide-item-content .desi-head-title.dynamic-name")
|
||||||
|
?.text()
|
||||||
|
.trim(),
|
||||||
|
description: $(el)
|
||||||
|
.find(".deslide-item-content .desi-description")
|
||||||
|
?.text()
|
||||||
|
?.split("[")
|
||||||
|
?.shift()
|
||||||
|
?.trim(),
|
||||||
|
poster: $(el)
|
||||||
|
.find(".deslide-cover .deslide-cover-img .film-poster-img")
|
||||||
|
?.attr("data-src")
|
||||||
|
?.trim(),
|
||||||
|
jname: $(el)
|
||||||
|
.find(".deslide-item-content .desi-head-title.dynamic-name")
|
||||||
|
?.attr("data-jname")
|
||||||
|
?.trim(),
|
||||||
|
otherInfo,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const trendingSelector: SelectorType =
|
||||||
|
"#trending-home .swiper-wrapper .swiper-slide";
|
||||||
|
|
||||||
|
$(trendingSelector).each((i, el) => {
|
||||||
|
res.trendingAnimes.push({
|
||||||
|
rank: parseInt(
|
||||||
|
$(el).find(".item .number")?.children()?.first()?.text()?.trim()
|
||||||
|
),
|
||||||
|
name: $(el)
|
||||||
|
.find(".item .number .film-title.dynamic-name")
|
||||||
|
?.text()
|
||||||
|
?.trim(),
|
||||||
|
id: $(el).find(".item .film-poster")?.attr("href")?.slice(1)?.trim(),
|
||||||
|
poster: $(el)
|
||||||
|
.find(".item .film-poster .film-poster-img")
|
||||||
|
?.attr("data-src")
|
||||||
|
?.trim(),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const latestEpisodeSelector: SelectorType =
|
||||||
|
"#main-content .block_area_home:nth-of-type(1) .tab-content .film_list-wrap .flw-item";
|
||||||
|
res.latestEpisodeAnimes = extractAnimes($, latestEpisodeSelector);
|
||||||
|
|
||||||
|
const topUpcomingSelector: SelectorType =
|
||||||
|
"#main-content .block_area_home:nth-of-type(3) .tab-content .film_list-wrap .flw-item";
|
||||||
|
res.topUpcomingAnimes = extractAnimes($, topUpcomingSelector);
|
||||||
|
|
||||||
|
const genreSelector: SelectorType =
|
||||||
|
"#main-sidebar .block_area.block_area_sidebar.block_area-genres .sb-genre-list li";
|
||||||
|
$(genreSelector).each((i, el) => {
|
||||||
|
res.genres.push(`${$(el).text().trim()}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
const mostViewedSelector: SelectorType =
|
||||||
|
'#main-sidebar .block_area-realtime [id^="top-viewed-"]';
|
||||||
|
$(mostViewedSelector).each((i, el) => {
|
||||||
|
const period = $(el).attr("id")?.split("-")?.pop()?.trim();
|
||||||
|
|
||||||
|
if (period === "day") {
|
||||||
|
res.top10Animes.today = extractTop10Animes($, period);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (period === "week") {
|
||||||
|
res.top10Animes.week = extractTop10Animes($, period);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (period === "month") {
|
||||||
|
res.top10Animes.month = extractTop10Animes($, period);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const topAiringSelector: SelectorType =
|
||||||
|
"#anime-featured .row div:nth-of-type(1) .anif-block-ul ul li";
|
||||||
|
$(topAiringSelector).each((i, el) => {
|
||||||
|
const otherInfo = $(el)
|
||||||
|
.find(".fd-infor .fdi-item")
|
||||||
|
.map((i, el) => $(el).text().trim())
|
||||||
|
.get();
|
||||||
|
|
||||||
|
res.topAiringAnimes.push({
|
||||||
|
id: $(el)
|
||||||
|
.find(".film-detail .film-name .dynamic-name")
|
||||||
|
?.attr("href")
|
||||||
|
?.slice(1)
|
||||||
|
?.trim(),
|
||||||
|
name: $(el)
|
||||||
|
.find(".film-detail .film-name .dynamic-name")
|
||||||
|
?.attr("title")
|
||||||
|
?.trim(),
|
||||||
|
jname: $(el)
|
||||||
|
.find(".film-detail .film-name .dynamic-name")
|
||||||
|
?.attr("data-jname")
|
||||||
|
?.trim(),
|
||||||
|
poster: $(el)
|
||||||
|
.find(".film-poster a .film-poster-img")
|
||||||
|
?.attr("data-src")
|
||||||
|
?.trim(),
|
||||||
|
otherInfo,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return res;
|
||||||
|
} catch (err: any) {
|
||||||
|
if (err instanceof AxiosError) {
|
||||||
|
throw createHttpError(
|
||||||
|
err?.response?.status || 500,
|
||||||
|
err?.response?.statusText || "Something went wrong"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
throw createHttpError.InternalServerError(err?.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default scrapeHomePage;
|
||||||
Reference in New Issue
Block a user