Skip to content

UnKnowNModder/Weeb-dl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 

Repository files navigation

Weeb Central Scraper 📚

A powerful, Python wrapper for scraping manga data from weebcentral.com. This library provides a clean, object-oriented interface to search for manga, retrieve metadata, and download chapters as either individual images or compiled PDFs.

Python Version License: MIT Status

Key Features

  • Advanced Search: Filter manga by title, genre, status, type, and more.
  • Detailed Metadata: Fetch all details for a manga series, including description, author, artist, aliases, and related series.
  • Chapter & Page Retrieval: Easily get lists of all chapters for a manga and all pages for a chapter.
  • Powerful Downloader:
    • Download a range of chapters for a specific manga.
    • Download chapters as neatly compiled PDF files.
    • Download chapters as raw image files organized in folders.
  • Efficient & Resilient: Built-in caching, request retries, and threading for fast and reliable performance.
  • Type-Hinted & Easy to Use: A clean, modern, and fully type-hinted codebase for deeper understanding

⚙️ Installation

To install the library and its dependencies, run the following command:

pip install requests beautifulsoup4 Pillow fpdf2 ua-generator

You will also need the enums.py file in the same directory as weeb.py to import the necessary filter criteria.


📖 Documentation

Here's a simple example to search for a manga and download the first five chapters as PDFs.

from weeb_central import Weeb, Manga, Chapter, NetworkError, ParsingError

# 1. Initialize the main client
weeb = Weeb()

try:
    # 2. Search for a manga
    print("Searching for 'Solo Leveling'...")
    search_results = weeb.search(query="Solo Leveling")

    if not search_results:
        print("No manga found.")
    else:
        # 3. Select the first result
        my_manga = search_results[0]
        print(f"Found: {my_manga.title}")

        # 4. Fetch the list of all chapters
        print("Fetching chapter list...")
        all_chapters = my_manga.get_chapters()
        print(f"Total chapters found: {len(all_chapters)}")

        # 5. Filter for chapters 1 through 5
        chapters_to_download = my_manga.filter_chapters(all_chapters, start=1, end=5)
        print(f"Preparing to download {len(chapters_to_download)} chapters...")

        # 6. Download the filtered chapters
        # This will create a folder named 'Solo-Leveling' and save PDFs inside.
        my_manga.download(chapters_to_download)

        print("Download complete!")

except (NetworkError, ParsingError) as e:
    print(f"An error occurred: {e}")

API Reference & Usage

The library is structured around several core classes: Weeb, Manga, and Chapter.

The Weeb Class

This is the main entry point for the library. It handles high-level actions like searching and discovering manga.

Weeb()

Initializes the client.

from weeb_central import Weeb
weeb = Weeb()

weeb.search(...)

Performs a comprehensive search for manga with advanced filtering.

Parameters:

  • query: str: The title or keyword to search for.
  • sort: Sort: How to sort the results. (e.g., Sort.BEST_MATCH).
  • order: Order: Order.ASCENDING or Order.DESCENDING.
  • official: OfficialTranslation: Filter by translation status.
  • anime: AnimeAdaptation: Filter by anime adaptation status.
  • adult: AdultContent: Filter by adult content.
  • status: List[SeriesStatus]: A list of statuses to include (e.g., [SeriesStatus.ONGOING]).
  • type: List[SeriesType]: A list of types to include (e.g., [SeriesType.MANHWA]).
  • genre: List[Genre]: A list of genres to include (e.g., [Genre.ACTION, Genre.FANTASY]).

Returns: List[Manga]

Example:

from enums import Genre, SeriesStatus, Sort

# Search for ongoing action/fantasy manga, sorted by popularity
results = weeb.search(
    sort=Sort.POPULARITY,
    status=[SeriesStatus.ONGOING],
    genre=[Genre.ACTION, Genre.FANTASY]
)

for manga in results:
    print(manga.title)

weeb.recently_added(page=1)

Retrieves a list of the most recently added manga series.

Returns: List[Manga]

Example:

# Get the second page of recently added manga
new_manga_list = weeb.recently_added(page=2)
for manga in new_manga_list:
    print(manga.title)

weeb.latest_updates(page=1)

Retrieves the most recent chapter updates across all manga.

Returns: Dict[Manga, Chapter]

Example:

latest = weeb.latest_updates()
for manga, chapter in latest.items():
    print(f"'{manga.title}' was updated to Chapter {chapter.index}")

weeb.hot_series(sort=HotSeries.WEEKLY)

Retrieves a list of trending ("hot") series for a given period.

Parameters:

  • sort: HotSeries: The time frame (HotSeries.WEEKLY, HotSeries.MONTHLY, HotSeries.ALL_TIME).

Returns: List[Manga]

Example:

from enums import HotSeries

# Get the hottest series of the month
hot_list = weeb.hot_series(sort=HotSeries.MONTHLY)
for manga in hot_list:
    print(manga.title)

weeb.hot_updates()

Gets the current "hot" chapter updates that are being read the most.

Returns: Dict[Manga, Chapter]

Example:

hot_updates = weeb.hot_updates()
for manga, chapter in hot_updates.items():
    print(f"Trending Update: '{manga.title}' - Chapter {chapter.index}")

The Manga Class

This class represents a single manga series and is used to fetch its specific data and chapters.

You typically get a Manga object from a weeb.search() call or other Weeb methods.

manga.get_details()

Fetches and populates the manga's metadata attributes (.details, .description, .aliases, .related_series).

Example:

a_manga = weeb.search(query="one piece")[0]

# Details are initially empty
print(a_manga.description) #-> ""

# Fetch details
a_manga.get_details()

# Now they are populated
print(f"Title: {a_manga.title}")
print(f"Author: {a_manga.details.get('Author')}")
print(f"Description: {a_manga.description[:100]}...") # Print first 100 chars
print(f"Aliases: {a_manga.aliases}")

manga.get_chapters()

Fetches a complete list of all Chapter objects for the manga, sorted chronologically.

Returns: List[Chapter]

Example:

all_chapters = a_manga.get_chapters()
print(f"Total chapters: {len(all_chapters)}")
print(f"Last chapter is: {all_chapters[-1].index}")

manga.filter_chapters(...)

A utility to filter a list of chapters by number or season.

Parameters:

  • chapters: List[Chapter]: The list of chapters to filter (usually from get_chapters()).
  • start: float: The starting chapter number.
  • end: float: The ending chapter number.
  • season: int: The specific season to filter by.

Returns: List[Chapter]

Example:

# Get all chapters
all_chapters = a_manga.get_chapters()

# Filter for chapters 100 to 110
chapters_100_to_110 = a_manga.filter_chapters(all_chapters, start=100, end=110)

# Filter for all chapters in Season 2 (Hypothetical splitted ranges if season not available)
season_2_chapters = a_manga.filter_chapters(all_chapters, season=2)

manga.download(chapters)

Downloads a list of Chapter objects. It creates a directory named after the manga and saves each chapter inside.

Parameters:

  • chapters: List[Chapter]: The list of chapters to download.

Example:

chapters_to_download = a_manga.filter_chapters(all_chapters, start=1, end=3)
# This will create a folder like 'One-Piece' and save:
# 1.pdf, 2.pdf, 3.pdf
a_manga.download(chapters_to_download)

The Chapter Class

This class represents a single manga chapter.

chapter.get_pages()

Fetches a list of all Page objects for the chapter.

Returns: List[Page]

Example:

first_chapter = a_manga.get_chapters()[0]
pages = first_chapter.get_pages()

for page in pages:
    print(f"Page {page.index}: {page.url}")

chapter.download(path, download_type=DownloadType.PDF)

Downloads the single chapter to a specified path.

Parameters:

  • path: str: The directory where the file should be saved.
  • download_type: DownloadType: The format (DownloadType.PDF or DownloadType.IMAGE).

Example:

import os
from enums import DownloadType

# Get the first chapter
first_chapter = a_manga.get_chapters()[0]

# Create a directory for our single chapter download
output_dir = "single_chapter_download"
os.makedirs(output_dir, exist_ok=True)

# Download as a PDF
first_chapter.download(path=output_dir, download_type=DownloadType.PDF)

# Download as images
# This will create a sub-folder inside `output_dir` named after the chapter index
first_chapter.download(path=output_dir, download_type=DownloadType.IMAGE)

📋 Using Enums

For all filtering and sorting operations, this library uses Enum classes for clarity and to prevent errors. You must import them from the enums.py file.

Available Enums:

  • Sort: For sorting search results (BEST_MATCH, LATEST_UPDATE, POPULARITY, etc.).
  • Order: For sort direction (ASCENDING, DESCENDING).
  • OfficialTranslation: (ANY, YES, NO).
  • AnimeAdaptation: (ANY, YES, NO).
  • AdultContent: (ANY, YES, NO).
  • SeriesStatus: (ONGOING, COMPLETED, HIATUS, CANCELED).
  • SeriesType: (MANGA, MANHWA, MANHUA, OEL).
  • Genre: A long list of all available genres (ACTION, ADVENTURE, FANTASY, etc.).
  • HotSeries: (WEEKLY, MONTHLY, ALL_TIME).
  • DownloadType: (PDF, IMAGE).

Import Example:

from enums import Sort, Order, Genre, SeriesStatus, DownloadType

⚠️ Error Handling

The library raises custom exceptions for common issues. It's best practice to wrap your calls in a try...except block to handle them gracefully.

  • NetworkError: Raised if there's a problem with the network connection, a timeout, or a server error (like HTTP 4xx or 5xx).
  • ParsingError: Raised if the HTML structure of the site changes and the scraper cannot find the expected data. (open issues to let me know)

Example:

from weeb_central import NetworkError, ParsingError

try:
    # Attempt to fetch something
    hot_manga = weeb.hot_series()
    for manga in hot_manga:
        manga.get_details()
        print(f"Fetched details for {manga.title}")
except (NetworkError, ParsingError) as e:
    print(f"Could not complete the operation: {e}")