AI Gebruik

Voor ons onderzoek hanteren wij Scribbr en Citation Machine voor automatische bronvermelding en citatie generatie.
Gemini Open AI werd gebruikt voor het scrapen op de top 100 manga van 2026.
Voor onze Status Quaestionis gebruikten wij Limo AI Assistant voor het scrapen van ons initieel onderzoek, zowel voor inkorting op relevantie als het zoeken naar de meest relevante bronnen. Daarnaast is het ook gebruikt geweest voor het opzoeken van de al bestaande literatuur over ons onderwerp.
Hiernaast gebruiken we ook de functie van Google Docs om een markdown automatisch te genereren voor ons eindproduct.
De Microsoft Edge extension Thunderbit werd gebruikt om de lijst van 2008 te scrapen voor de top 100 manga zelf.
Microsoft Copilot gebruikten we in het eerste deel van het genereren van een script om scrapen op informatie efficiënter te maken. Het uiteindelijke script werd voor Google Colab gegenereerd.
Chat GPT werd gehanteerd voor het begeleiden van OpenRefine om onze messy data van Excel op te schonen, zowel als in het tweede gedeelte van het genereren van Python script om te scrapen op de top 100 manga via MyAnimeList, auteurs, hoofdpersonages, genres, URLs, demografische categorieën en de geslachten van de auteurs en hun hoofdpersonages.

Scrapen op Top 100 Manga 2008

De lijst van 2026 is via Excel gescraped, en met OpenRefine opgeschoond. De lijst van 2008, daarentegen, hebben we met de Microsoft Edge extentie Thunderbit gegenereerd en handmatig opgeschoond.

Met deze extensie hebben we de gebruikte links, waaronder https://web.archive.org/web/20080227032536/https://myanimelist.net/topmanga.php gescraped voor ‘Rank’, ‘Title’ en ‘Score’. Wanneer je het programma uitvoert, geeft het een lijst terug met de gevraagde gegevens, die je in Excel kan openen, editen en opslaan. Op deze manier hebben we de vier verschillende links gescraped en handmatig op Excel samen gezet.

Er waren vier verschillende links voor de gegevens van 2008, omdat in deze tijd enkel de ‘top 30’ per link getoond werden. We hebben via de Wayback Machine de meeste dicht liggende gegevens handmatig gevonden, en deze gescraped. Hierdoor ontstonden wel enkele problemen met duplicaten. Die hebben we als volgt opgeschoond:

NANA #28 score 8,48 > #33 score 8,42 (omdat de top 30 van 27 feb zijn en de top 60 van 17 jan)
Planetes #29 score 8,48 > #43 score 8,39 (omdat de top 30 van 27 feb zijn en de top 60 van 17 jan)
21st Century Boys #26 score 8,55 > #44 score 8,39 (omdat de top 30 van 27 feb zijn en de top 60 van 17 jan)
Saiyuki Reload #63 score 8,33 > #63 score 8,32 (een 0,01 verschil en we moesten 1 kiezen. Blijft op dezelfde positie)
Naruto #92 score 8,24 > #83 score 8,25 (omdat de top 90 van 17 jan zijn en de top 100 van 19 jan)
Neon Genesis Evangelion Re-Take After #91 score 8,25 > #38 score 8,41 (omdat de top 90 van 17 jan zijn en de top 100 van 19 jan)

Dit liet 6 plaatsen achteraan de top 100 open. We hebben onze vierde gegeven die de top 90-120 toonde gebruikt om de daaropvolgende top 101-107 in de top 100 in te voeren.

Scrapen op Auteurss

Het script voor het scrapen op auteurs was het eerste script dat we hebben gegenereerd om op de top 100 manga die we eerder geschrapt hadden (via Excel en OpenRefine en met Thunderbit) voor 2008 en 2026. Dit was het succesvolle script dat in Google Colab werkte, na enkele generaties op Microsoft Copilot (wat onsuccesvol was), en Chat GPT:

\<pre>\<code>
import requests
from bs4 import BeautifulSoup
import urllib.parse
import pandas as pd
import time

# Make requests look like a real browser (important for MAL)
HEADERS \= {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}

SEARCH_URL \= "https://myanimelist.net/manga.php?q="

def search_manga(title):
query \= urllib.parse.quote(title)
url \= SEARCH_URL + query

response \= requests.get(url, headers=HEADERS)  
soup \= BeautifulSoup(response.text, "html.parser")

\# Find first manga result  
for link in soup.select("a.hoverinfo\_trigger"):  
    href \= link.get("href", "")  
    if "/manga/" in href:  
        return href

return None

def get_authors(url):
response \= requests.get(url, headers=HEADERS)
soup \= BeautifulSoup(response.text, "html.parser")

for div in soup.select("div.spaceit\_pad"):  
    label \= div.find("span", class\_="dark\_text")

    if label and "Authors:" in label.text:  
        authors \= \[\]  
        for a in div.find\_all("a"):  
            name \= a.text.strip()  
            if name:  
                authors.append(name)  
        return authors

return \[\]

def process_titles(titles):
rows \= []

for title in titles:  
    print(f"Searching: {title}")  
    url \= search\_manga(title)

    if not url:  
        print("  No manga found\\n")  
        rows.append(\[title, None, None\])  
        continue

    authors \= get\_authors(url)

    \# Console output (what you asked for)  
    if authors:  
        for author in authors:  
            print(f"  {author}")  
        authors\_joined \= ", ".join(authors)  
    else:  
        print("  No authors found")  
        authors\_joined \= None

    print()

    rows.append(\[title, url, authors\_joined\])

    time.sleep(2)  \# avoid getting blocked

return rows

# --------------------------
# YOUR TITLES
# --------------------------
titles \= [
"ReLIFE",
"Pluto",
"Skip to Loafer",
"Banana Fish",
"Mob Psycho 100",
"Blue Period"
]

# Run script
data \= process_titles(titles)

# Save to Excel
df \= pd.DataFrame(data, columns=["Title", "MAL URL", "Authors"])
df.to_excel("manga_authors.xlsx", index=False)

print("Saved to manga_authors.xlsx")
\</code>\</pre>

Scrapen op Hoofdpersonages

Het script om op hoofdpersonages te scrapen, genereerde elk gegeven per manga in de top 100 waarvan het karakter de tag ‘Main’ had, en was dus het volgende:

\<pre>\<code>
import requests
from bs4 import BeautifulSoup
import urllib.parse
import pandas as pd
import time
import re

HEADERS \= {
"User-Agent": "Mozilla/5.0",
"Referer": "https://myanimelist.net/"
}

SEARCH_URL \= "https://myanimelist.net/manga.php?q="

def search_manga(title):
query \= urllib.parse.quote(title)
url \= SEARCH_URL + query

response \= requests.get(url, headers=HEADERS)  
soup \= BeautifulSoup(response.text, "html.parser")

for link in soup.select("a.hoverinfo\_trigger"):  
    href \= link.get("href", "")  
    if "/manga/" in href:  
        return "https://myanimelist.net" \+ href

return None

def format_name(name):
parts \= name.split(", ")
if len(parts) \== 2:
return f"{parts[1]} {parts[0]}"
return name

def get_main_characters(manga_url):
match \= re.search(r"/manga/(\d+)", manga_url)
if not match:
return []

manga\_id \= match.group(1)  
api\_url \= f"https://api.jikan.moe/v4/manga/{manga\_id}/characters"

response \= requests.get(api\_url)  
if response.status\_code \!= 200:  
    return \[\]

data \= response.json()  
characters \= \[\]

for char in data.get("data", \[\]):  
    if char.get("role") \== "Main":  
        raw\_name \= char\["character"\]\["name"\]  
        formatted \= format\_name(raw\_name)  
        characters.append(formatted)

return characters

def process_titles(titles):
rows \= []

for title in titles:  
    print(f"Searching: {title}")  
    url \= search\_manga(title)

    if not url:  
        print("  No manga found\\n")  
        rows.append(\[title, None, None\])  
        continue

    characters \= get\_main\_characters(url)

    if characters:  
        print(f"  {', '.join(characters)}\\n")  
        rows.append(\[title, url, ", ".join(characters)\])  
    else:  
        print("  No main characters found\\n")  
        rows.append(\[title, url, None\])

    time.sleep(1.5)

return rows

# --------------------------
titles \= [
"Tobaku Datenroku Kaiji: One Poker-hen"
]

data \= process_titles(titles)

df \= pd.DataFrame(data, columns=["Title", "MAL URL", "Main Characters"])
df.to_excel("manga_characters.xlsx", index=False)

print("Saved to manga_characters.xlsx")
\</code>\</pre>

Scrapen op Genres en Demografische Gegevens

Daarnaast is dit script gebruikt om op genres en demografische categorieën te scrapen:

\<pre>\<code>
import requests
from bs4 import BeautifulSoup
import urllib.parse
import pandas as pd
import time

HEADERS \= {
"User-Agent": "Mozilla/5.0"
}

SEARCH_URL \= "https://myanimelist.net/manga.php?q="

def search_manga(title):
query \= urllib.parse.quote(title)
url \= SEARCH_URL + query

r \= requests.get(url, headers=HEADERS)  
soup \= BeautifulSoup(r.text, "html.parser")

for a in soup.select("a.hoverinfo\_trigger"):  
    href \= a.get("href", "")  
    if "/manga/" in href:  
        return href

return None

def get_genres_and_demographic(manga_url):
r \= requests.get(manga_url, headers=HEADERS)
soup \= BeautifulSoup(r.text, "html.parser")

genres \= \[\]  
demographic \= None

for block in soup.select("div.spaceit\_pad"):  
    label \= block.find("span", class\_="dark\_text")  
    if not label:  
        continue

    text \= label.text.strip()

    if "Genres:" in text or "Genre:" in text:  
        genres \= \[a.text.strip() for a in block.find\_all("a")\]

    if "Demographic:" in text:  
        a \= block.find("a")  
        if a:  
            demographic \= a.text.strip()

return genres, demographic

def process_titles(titles):
rows \= []

for title in titles:  
    print(f"Searching: {title}")

    url \= search\_manga(title)

    if not url:  
        print("  Not found\\n")  
        rows.append(\[title, None, None, None\])  
        continue

    genres, demo \= get\_genres\_and\_demographic(url)

    print("  Genres:", ", ".join(genres) if genres else "None")  
    print("  Demographic:", demo if demo else "None\\n")

    rows.append(\[  
        title,  
        url,  
        ", ".join(genres) if genres else None,  
        demo  
    \])

    time.sleep(1.5)

return rows

# --------------------------
titles \= [
"Berserk",
"Monster",
"Vagabond",
"Eden: It's an Endless World!"
]

data \= process_titles(titles)

df \= pd.DataFrame(data, columns=["Title", "MAL URL", "Genres", "Demographic"])
df.to_excel("manga_genres.xlsx", index=False)

print("Saved to manga_genres.xlsx")
\</code>\</pre>