Anichin Scraper

Anichin adalah salah satu situs populer untuk menonton atau mengunduh anime yang diterjemahkan dalam bahasa Indonesia.

Muhamad Nur Ibad

7 Januari 20251 menit baca

Anichin adalah salah satu situs populer untuk menonton atau mengunduh anime yang diterjemahkan dalam bahasa Indonesia. Dengan banyaknya konten yang tersedia, kadang diperlukan pencarian otomatis untuk mendapatkan informasi tentang anime tertentu. Dalam artikel ini, kita akan membahas cara melakukan web scraping di situs Anichin menggunakan Node.js, Axios, dan Cheerio.

Teknologi yang Digunakan

  1. Axios: Untuk melakukan HTTP request dan mendapatkan konten dari halaman web.

  2. Cheerio: Untuk memanipulasi dan mengekstrak data dari HTML seperti jQuery.

  3. Node.js: Lingkungan eksekusi JavaScript di server.


Langkah-langkah Scraping di Anichin

1. Mencari Anime Berdasarkan Query

Kode berikut digunakan untuk mencari anime berdasarkan kata kunci (query):

const axios = require('axios');
const cheerio = require('cheerio');

async function anichinSearch(query) {
    try {
        const url = `https://anichin.site/?s=${query}`;
        const response = await axios.get(url);
        const html = response.data;
        const $ = cheerio.load(html);

        const results = [];
        const elements = $('.listupd .bs').toArray();

        const fetchEpisodeInfoPromises = elements.map(async (element) => {
            const title = $(element).find('.tt h2').text().trim();
            const link = $(element).find('.bsx > a').attr('href');
            const image = $(element).find('img').attr('data-lazy-src');
            const type = $(element).find('.typez').text().trim();
            const status = $(element).find('.bt .epx').text().trim();
            const subtitle = $(element).find('.bt .sb').text().trim();

            const episodeInfo = await getEpisodeInfo(link);

            return {
                title,
                link,
                image,
                type,
                status,
                subtitle,
                episodeCount: episodeInfo.episodeCount,
                episodes: episodeInfo.episodes
            };
        });

        const fetchedResults = await Promise.all(fetchEpisodeInfoPromises);
        results.push(...fetchedResults);

        console.log(JSON.stringify(results, null, 2));
    } catch (error) {
        console.error('Error:', error);
        throw new Error('Scraping failed');
    }
}

Fungsi ini mengambil data seperti judul anime, link halaman, gambar, jenis, status, subtitle, jumlah episode, dan daftar episode.

2. Mendapatkan Informasi Episode

Setelah mendapatkan link halaman detail anime, kita dapat mengekstrak informasi episode seperti judul, nomor, tanggal rilis, subtitle, dan link. Berikut kodenya:

async function getEpisodeInfo(link) {
    try {
        const response = await axios.get(link);
        const html = response.data;
        const $ = cheerio.load(html);

        const episodes = [];
        const episodeCount = $('.eplister ul li').length;

        const episodeElements = $('.eplister ul li').toArray();
        const fetchVideoUrlPromises = episodeElements.map(async (element) => {
            const episodeNumber = $(element).find('.epl-num').text().trim();
            const episodeTitle = $(element).find('.epl-title').text().trim();
            const episodeSubtitle = $(element).find('.epl-sub .status').text().trim();
            const episodeDate = $(element).find('.epl-date').text().trim();
            const episodeLink = $(element).find('a').attr('href');

            // Fetch video URL from episode page
            const videoUrl = await getVideoUrl(episodeLink);

            return {
                number: episodeNumber,
                title: episodeTitle,
                subtitle: episodeSubtitle,
                date: episodeDate,
                url: episodeLink,
                videoUrl: videoUrl
            };
        });

        const fetchedEpisodes = await Promise.all(fetchVideoUrlPromises);
        episodes.push(...fetchedEpisodes);

        return { episodeCount, episodes };
    } catch (error) {
        console.error('Error fetching episode info:', error);
        return { episodeCount: 0, episodes: [] };
    }
}

3. Mendapatkan URL Video

Fungsi berikut akan mengekstrak URL video dari halaman episode tertentu:

async function getVideoUrl(episodeLink) {
    try {
        const response = await axios.get(episodeLink);
        const html = response.data;
        const $ = cheerio.load(html);

        const videoUrl = $('.video-content .player-embed iframe').attr('data-lazy-src') || 
                         $('.video-content .player-embed iframe').attr('src');

        return videoUrl;

    } catch (error) {
        console.error('Error fetching video URL:', error);
        return null;
    }
}

Fungsi ini mencari elemen yang memuat URL video.


Contoh Penggunaan

Untuk mencari anime berdasarkan query, kita dapat memanggil fungsi anichinSearch:

const { anichinSearch } = require('./anichinScraper');

(async () => {
    await anichinSearch('Naruto');
})();

Output

Setelah menjalankan kode, kita akan mendapatkan output dalam format JSON seperti berikut:

[
  {
    "title": "Naruto",
    "link": "https://anichin.site/naruto/",
    "image": "https://example.com/image.jpg",
    "type": "TV",
    "status": "Completed",
    "subtitle": "Sub Indo",
    "episodeCount": 220,
    "episodes": [
      {
        "number": "1",
        "title": "Awal Perjalanan",
        "subtitle": "Sub Indo",
        "date": "2023-12-25",
        "url": "https://anichin.site/episode-1/",
        "videoUrl": "https://example.com/video.mp4"
      }
    ]
  }
]

Kesimpulan

Dengan menggunakan kombinasi Axios dan Cheerio, kita dapat dengan mudah melakukan scraping data dari situs seperti Anichin. Teknik ini berguna untuk mengotomasi proses pencarian atau pengambilan data secara cepat. Namun, selalu ingat untuk mematuhi kebijakan situs terkait scraping agar tidak melanggar ketentuan mereka.

Creator: Itzky - Muhammad Zaki
Sumber: https://whatsapp.com/channel/0029VaZSdai5Ui2TMoNsYo0J