scrape-airing-anime
The one stop shop for currently airing anime. Ask three of the biggest anime databases what is on the air right now, get one normalised table back.
$ scrape-airing-anime --dedupe --limit 5
# title score eps type season source
- ------------------------------------------ ----- --- ---- ----------- ------
1 Sousou no Frieren 2 9.12 24 TV summer 2026 mal
2 Mushoku Tensei: Isekai Ittara Honki Dasu 3 8.42 14 TV summer 2026 kitsu
3 One Piece 8.40 ? TV fall 1999 kitsu
...
Sources
| source | backed by | what you get |
|---|---|---|
mal |
Jikan, the public MyAnimeList API | current season: scores, members, genres, studios, synopsis |
anilist |
AniList GraphQL | everything RELEASING (long-runners included), genres, studios |
kitsu |
Kitsu JSON:API | everything currently airing, user counts, synopsis |
No API keys, no HTML scraping, no headless browsers. Scores are normalised to one 0-10 scale across all three. If one source is having a bad day (AniList once switched its entire public API off, mid-development of this very tool), you get a warning on stderr and results from the others: the pipeline never dies with the fleet.
Install
pip install scrape-airing-anime # or: uv tool install scrape-airing-anime
Or run it without installing: uvx scrape-airing-anime / pipx run scrape-airing-anime.
No dependencies. Python 3.9+ and the standard library, that is the whole stack.
Use
scrape-airing-anime # table of everything, all sources
scrape-airing-anime --dedupe # collapse duplicates across sources
scrape-airing-anime -s mal -n 25 # top of MAL's current season
scrape-airing-anime --min-score 8 -f csv -o top.csv
scrape-airing-anime -f json -o ~/Desktop # airing-anime.json on the Desktop
scrape-airing-anime -f jsonl -o - | jq .title # stdout carries only data
scrape-airing-anime -f csv -o - | duckdb -c \
"SELECT source, count(*) FROM read_csv('/dev/stdin') GROUP BY 1"
Every diagnostic (progress, warnings, the final summary) goes to stderr, so stdout is always clean CSV/JSON/JSONL you can pipe.
Full options: --source {mal,anilist,kitsu,all}, --format {table,csv,json,jsonl},
--limit N (per source), --min-score X, --sort {score,popularity,title},
--dedupe, --timeout SECONDS, --version.
Library
from scrape_airing_anime import REGISTRY
shows = REGISTRY["kitsu"](limit=10)
for show in shows:
print(f"{show.score or '-':>5} {show.title} ({show.url})")
Every source returns list[AiringAnime], a frozen dataclass with title,
source, url, media_type, episodes, score, popularity, season,
year, genres, studios and synopsis.
Behaviour worth knowing
- Politeness built in: a descriptive User-Agent, retries with exponential
backoff,
Retry-Afterrespected, and a pause between Jikan pages (they ask for at most 1 request/second). popularityis source-local (MAL members vs AniList popularity vs Kitsu user count). Compare it within one source, not across them.--dedupekeeps the first hit in source order (mal, anilist, kitsu), matching on accent-and-punctuation-insensitive titles.- Kitsu does not ship genres/studios on its base resource, so those two columns are empty for that source.
Test
python3 -m unittest discover tests
36 tests, all offline: every HTTP interaction is faked, so the suite runs in milliseconds and does not hammer anyone's API.
Heritage
This repo began life in 2021 as scrape-myanimelist-airing: a requests-html
scraper of MAL's top-airing page and a pandas notebook. The HTML scraping is
gone (that is what always breaks), the ambition grew, the name followed.
License
MIT.
Release files for scrape-airing-anime 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| scrape_airing_anime-1.0.1.tar.gz | 16.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| scrape_airing_anime-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 32.3 kB
Release files / scrape_airing_anime-1.0.1.tar.gz
| Download URL | scrape_airing_anime-1.0.1.tar.gz |
|---|---|
| Size | 16.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c64375416fcad8feb5361bffbfcb4a95bb5ebac22cea5fb54c5e95a3f7b7a2d8
|
|
BLAKE2b-256 checksum How to use checksums |
35e94bdd9094e95187031793bbb3357cfa3efe346159a15e9a5859e09a5c3968
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 7, 2026.
Transparency logRelease files / scrape_airing_anime-1.0.1-py3-none-any.whl
| Download URL | scrape_airing_anime-1.0.1-py3-none-any.whl |
|---|---|
| Size | 15.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f97d66a0989ef73316ca52458713950b71debe8b62a495c314a589725adc3937
|
|
BLAKE2b-256 checksum How to use checksums |
30cd25687efcf31bfbf5e6b43fb855034a67d4263af2385276e6020ac0f55ab5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 7, 2026.
Transparency log