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>