aniwave-scraper
Version:
a simple anime scraper for aniwave website
119 lines (118 loc) • 5.61 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const axios_1 = __importDefault(require("axios"));
const cheerio_1 = __importDefault(require("cheerio"));
const user_agents_1 = __importDefault(require("user-agents"));
const Methods_1 = __importDefault(require("./Methods"));
const errmsg = ["[ X ] failed to fetch the data", "check whether the anime name or url is valid"];
const useragent = new user_agents_1.default({ deviceCategory: "desktop" });
class AniwaveScraper extends Methods_1.default {
animeSearch(query) {
return __awaiter(this, void 0, void 0, function* () {
let searchURL = `${this.baseURL}/filter?keyword=${encodeURIComponent(query).replace(/%20/g, "+")}`;
return new Promise((resolve, _reject) => {
(0, axios_1.default)({
url: searchURL,
method: "GET",
headers: {
"User-Agent": `${useragent}`
}
}).then((res) => {
let $ = cheerio_1.default.load(res.data);
let animes = [];
$("body").find(".aside-wrapper.mt-5 > .main > section > .body").find("#list-items > .item").each((_i, elem) => this.getItems(animes, elem));
resolve(animes);
}).catch(() => {
return console.error(errmsg.join(". "));
});
});
});
}
recentRelease() {
return __awaiter(this, arguments, void 0, function* (type = "all", page = 1) {
const recentURL = (type === "trending" || type === "random") ? `${this.baseURL}/ajax/home/widget/${type}?page=${page}` : `${this.baseURL}/ajax/home/widget/updated-${type}?page=${page}`;
return new Promise((resolve, _reject) => {
(0, axios_1.default)({
url: recentURL,
method: "GET",
headers: {
"User-Agent": `${useragent}`
}
}).then((res) => {
let $ = cheerio_1.default.load(res.data.result);
let animes = [];
$(".ani.items > .item").each((_i, elem) => {
this.getItems(animes, elem);
});
resolve(animes);
}).catch(() => {
return console.error(errmsg[0]);
});
});
});
}
topAnime() {
return __awaiter(this, arguments, void 0, function* (duration = "day") {
const topURL = `${this.baseURL}/home`;
return new Promise((resolve, _reject) => {
(0, axios_1.default)({
url: topURL,
method: "GET",
headers: {
"User-Agent": `${useragent}`
}
}).then((res) => {
const $ = cheerio_1.default.load(res.data);
const wrapper = $(`.home > #wrapper > #body > .container`).find(`.sidebar > #top-anime > .body > div[data-name="${duration}"] > .scaff.side.items`);
let animes = [];
$(wrapper).find(".item").each((i, elem) => {
this.getItems(animes, elem);
animes[i].rank = (i + 1);
});
resolve(animes);
}).catch(() => {
return console.error(errmsg[0]);
});
});
});
}
animeInfo(url) {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, _reject) => {
(0, axios_1.default)({
url: url,
method: "GET",
headers: {
"User-Agent": `${useragent}`
}
}).then((res) => {
let $ = cheerio_1.default.load(res.data);
const metaContainer = $("#body").find(".aside-wrapper > .main > #w-info > .binfo");
const relatedContainer = $("#body").find(".aside-wrapper > .sidebar > #w-related > .body");
let anime = {};
this.getAnimeMeta(anime, metaContainer);
if ($(relatedContainer).html() === null)
anime.related = [];
else
this.getAnimeRelated(anime, relatedContainer);
resolve(anime);
}).catch(() => {
return console.error(errmsg.join(". "));
});
});
});
}
}
exports.default = AniwaveScraper;