ytscrape — Free YouTube Scraper for Python
Free, open-source YouTube scraper library for Python. Scrape YouTube search results — videos, channels, playlists and Shorts — plus detailed video metadata, without an official YouTube Data API key and without any quota limits.
ytscrape is a free YouTube scraper and crawler for Python built on top of
the internal YouTube InnerTube API. Use it to search YouTube, extract
video, channel and playlist data, and fetch video metadata — all with
transparent pagination and no API key required.
Whether you need to scrape YouTube videos, collect channel data, mine
YouTube search results, or build a YouTube data extractor or dataset,
ytscrape gives you a simple, Pythonic interface and a clean, extensible
architecture that is easy to grow with new endpoints and data sources.
Keywords: free youtube scraper, youtube scraper python, youtube data extractor, youtube api without key, scrape youtube videos, youtube channel scraper, youtube search scraper, youtube crawler, youtube metadata, python youtube scraping library, open source youtube scraper.
⚠️ This library talks to YouTube's private endpoints. Use it responsibly and at your own risk; the endpoints and
paramsvalues may change over time.
Why ytscrape?
- ✅ Free & open source (MIT) — no paid plans, no sign-up, no rate-limit tiers.
- 🔑 No YouTube Data API key required and no quota to worry about.
- 🐍 Pure Python with full type hints and a tiny, dependency-light install.
- ⚡ Simple, Pythonic API — start scraping YouTube in just a few lines.
Features
- 🔎 Search videos, channels and playlists with a clean
SearchFilterenum (no magicEgIQAQ==strings in your code). - 📄 Transparent pagination — just iterate; continuation tokens are handled for you.
- 🎬 Fetch detailed video metadata from an id or any YouTube URL.
- 🌍 Language & country support — localise results with the
LanguageandCountryvalue objects (thin wrappers around raw ISO codes, no hard-coded lists) bundled in a smallLocaleobject; codes are validated withpycountry, so typos fail fast. - 🧱 Extensible OOP design (facade + factory methods + strategy) and full type hints — easy to build on.
- 🖥️ A tiny CLI:
python -m ytscrape ....
Installation
pip install ytscrape
From source:
pip install .
Quick start
from ytscrape import YouTube, SearchFilter
with YouTube() as yt:
# Search videos and iterate over as many pages as needed.
for video in yt.search("python", filter=SearchFilter.VIDEOS, max_results=20):
print(video.title, "-", video.url)
# Search channels.
for channel in yt.search("python", filter=SearchFilter.CHANNELS, max_results=5):
print(channel.title, channel.url)
# Fetch details for a single video (id or URL both work).
details = yt.video("https://www.youtube.com/watch?v=dQw4w9WgXcQ")
print(details.title, details.channel, details.views)
Search filters
| Filter | Description |
|---|---|
SearchFilter.ALL |
Everything (default) |
SearchFilter.VIDEOS |
Videos only |
SearchFilter.CHANNELS |
Channels only |
SearchFilter.PLAYLISTS |
Playlists only |
SearchFilter.SHORTS |
Shorts only |
SearchFilter.MOVIES |
Movies only |
You can also pass the string form: yt.search("python", filter="videos").
Language & country
YouTube localises results by interface language (hl) and content region
(gl). Configure both when creating YouTube, passing plain ISO codes (or the
Language / Country value objects, which wrap the same codes):
from ytscrape import YouTube, Language, Country, Locale
# Just pass raw ISO codes — they are validated and normalised for you.
with YouTube(language="uk", region="UA") as yt:
for video in yt.search("музика", max_results=10):
print(video.title, video.url)
# The Language / Country value objects are equivalent (and reusable).
yt = YouTube(language=Language("de"), region=Country("DE"))
# Invalid codes are rejected early (validated with pycountry).
YouTube(region="XX") # ValueError: Unknown country code 'XX'. ...
# Or pass a ready-made Locale.
yt = YouTube(locale=Locale(language="fr", country="FR"))
print(yt.locale.language.code, yt.locale.country.code) # fr FR
Language and Country are thin, self-validating value objects around a raw
ISO 639-1 / ISO 3166-1 alpha-2 code — there is no hard-coded list of languages
or countries, so any valid code works. Codes are validated with
pycountry: an unknown language or
country code raises a ValueError instead of silently producing a broken
request. The chosen locale is sent both in the request context (hl / gl)
and as the Accept-Language HTTP header.
Pagination
Pagination is transparent — iterating over the result object automatically loads the next page:
results = yt.search("python")
for item in results: # loads pages on demand
print(item.title)
You can also page manually:
results = yt.search("python")
print(len(results.fetch_next_page())) # explicitly load one more page
print(results.has_more) # is there another page?
Use max_results to cap how many items you consume.
Use cases
ytscrape is a great fit when you want to:
- Scrape YouTube search results for a keyword or topic.
- Extract YouTube video data (title, channel, views, duration, thumbnails).
- Collect YouTube channel and playlist listings at scale.
- Build a YouTube dataset for research, analytics or machine learning.
- Monitor YouTube content for a niche without hitting API quotas.
Command line
# Search
python -m ytscrape search "python tutorial" --filter videos --max 10
# Localised search (Ukrainian interface, Ukrainian region)
python -m ytscrape --language uk --region UA search "музика" --max 10
# Video details
python -m ytscrape video https://www.youtube.com/watch?v=dQw4w9WgXcQ
After installing, a ytscrape console script is also available:
ytscrape search "python" --filter channels --max 5
License
"build>=1.5.0",
"twine>=7.0.0",
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ytscrape-0.1.1.tar.gz.
File metadata
- Download URL: ytscrape-0.1.1.tar.gz
- Upload date:
- Size: 16.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.10.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
369c9f0c2332408869e09ed72e7787e0ada15e64d7d428f7b16ddae7993cb995
|
|
| MD5 |
189f942041b590cd61e6b7f197373211
|
|
| BLAKE2b-256 |
72b232cb43da7706478b0e03df7ba1b5a47eac29046df50a66caeebd00c24ea8
|
File details
Details for the file ytscrape-0.1.1-py3-none-any.whl.
File metadata
- Download URL: ytscrape-0.1.1-py3-none-any.whl
- Upload date:
- Size: 22.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/7.0.0 CPython/3.10.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
038c7a6bb6ea0ff9d8509e8b73b4bff86e6ac9c4fabe6b6df6badc27492d3677
|
|
| MD5 |
07fe826c4d23fb4c090c9cd39b3c2e48
|
|
| BLAKE2b-256 |
028b7145e17555200e6af9b3809c492485740a1c82f1e81f1c4968edacfb59f8
|