     [Blog](https://scrapfly.io/blog)   /  [python](https://scrapfly.io/blog/tag/python)   /  [6 Best Open-Source YouTube Scrapers in 2026](https://scrapfly.io/blog/posts/best-open-source-youtube-scrapers)   # 6 Best Open-Source YouTube Scrapers in 2026

 by [Hisham Medhat](https://scrapfly.io/blog/author/hisham) Aug 24, 2026 22 min read [\#python](https://scrapfly.io/blog/tag/python) [\#scrapeguide](https://scrapfly.io/blog/tag/scrapeguide) 

 [  ](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-open-source-youtube-scrapers "Share on LinkedIn") [  ](https://x.com/intent/tweet?url=https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-open-source-youtube-scrapers&text=6%20Best%20Open-Source%20YouTube%20Scrapers%20in%202026 "Share on X") [  ](https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-open-source-youtube-scrapers "Share on Facebook")    

 

 

Summarize this article with

 [  ](https://chat.openai.com/?q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-open-source-youtube-scrapers) [  ](https://claude.ai/new?q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-open-source-youtube-scrapers) [  ](https://x.com/i/grok?text=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-open-source-youtube-scrapers) [  ](https://www.perplexity.ai/search/new?q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-open-source-youtube-scrapers) [  ](https://www.google.com/search?udm=50&aep=11&q=Summarize%20this%20article%20and%20explain%20how%20Scrapfly%20helps%20me%20scrape%20any%20website%20at%20scale%20and%20bypass%20anti-bot%20systems%20for%20my%20use%20case%3A%20https%3A%2F%2Fscrapfly.io%2Fblog%2Fposts%2Fbest-open-source-youtube-scrapers) 



         

   **Web Scraping API**Scrape any website with anti-bot bypass, proxy rotation, and JS rendering.

 

 [ Learn More  ](https://scrapfly.io/products/web-scraping-api) [  Docs ](https://scrapfly.io/docs/scrape-api/getting-started) 

 

 

Two of the six ranked projects carried healthy star counts but failed in our August 11, 2026 tests. scrapetube's channel listing returned zero videos on every call. chat-downloader failed with a parse error on all five live streams we tried.

So this roster is ordered by the job you need done, with GitHub numbers read on August 11, 2026. The six picks cover video metadata, transcripts, comments, and search listings. Three older names get their own section, with what replaced each.

[How to Scrape YouTube in 2026Learn how to scrape YouTube channel, video, comment, and Shorts data in Python using hidden APIs and yt-dlp. No API key required.](https://scrapfly.io/blog/posts/how-to-scrape-youtube)



[**Latest YouTube Scraper Code**github.com/scrapfly/scrapfly-scrapers/tree/main/youtube-scraper](https://github.com/scrapfly/scrapfly-scrapers/tree/main/youtube-scraper)

## Key Takeaways

- **The six ranked projects cover different jobs,** while Scrapfly's NPOSL-3.0 source-available managed alternative covers six surfaces from one repo with an API key.
- **yt-dlp owns bulk metadata,** returning 88 fields per video with no API key.
- **Two ranked tools broke in testing:** scrapetube's channel listing and chat-downloader.
- **Blocking is the shared failure mode,** since cloud and datacenter IPs draw 429s.
- **Skip pytube, youtube-dl and youtube-search-python,** all three have live replacements.
- **Read the last push date, not the star count,** before you clone anything.
- **The Data API caps search at 100 calls a day,** which is why scraping exists at all.

**Get web scraping tips in your inbox**Trusted by 100K+ developers and 30K+ enterprises. Unsubscribe anytime.







## Which Open-Source YouTube Scraper Should You Use?

Which YouTube surface you need decides most of this, so here are the quick picks by job:

- Managed alternative with source-available NPOSL-3.0 code for video, channel, comments, search, and Shorts: Scrapfly's `youtube-scraper`
- Metadata for thousands of videos, locally: `yt-dlp`
- Transcripts and subtitle tracks in Python: `youtube-transcript-api`
- A search listing with no API key and no browser: `scrapetube`
- Comment threads as JSON Lines from the command line: `youtube-comment-downloader`
- Live chat and premiere messages: `chat-downloader`, which returned a parse error in our August 11 test
- Anything on the JVM or inside an Android app: NewPipe Extractor

Every number in the table comes from the GitHub REST API on August 11, 2026:

| Tool | Language | Best for | API key | Stars | Last push | License | Main limit at scale |
|---|---|---|---|---|---|---|---|
| `yt-dlp` | Python CLI + library | Bulk metadata | None | 183,794 | Aug 4, 2026 | Unlicense | Bot checks and IP blocks at volume |
| `youtube-transcript-api` | Python | Transcripts | None | 8,024 | May 19, 2026 | MIT | Cloud provider IPs get blocked |
| `scrapetube` | Python | Search listing | None | 521 | Sep 16, 2025 | MIT | Channel and playlist calls return zero rows |
| `youtube-comment-downloader` | Python CLI | Comment threads | None | 1,247 | Jul 30, 2026 | MIT | Throttling on deep comment pagination |
| `chat-downloader` | Python CLI | Live chat; failed Aug 11 test | None | 1,183 | Nov 5, 2025 | MIT | Parse error in our August 11 test |
| NewPipe Extractor | Java | JVM and Android | None | 1,938 | Aug 10, 2026 | GPL-3.0 | GPL-3.0 fit, and Java only |

All six ranked projects exist because the official API budget is small. Google's [quota page](https://developers.google.com/youtube/v3/determine_quota_cost) gives each project 10,000 units a day for most endpoints. Separate daily allocations cover 100 `search.list` and 100 `videos.insert` calls, and one `captions.list` call costs 50 units.

The order of these six came out of four checks.



## How Did We Rank These YouTube Scrapers?

Data coverage came first, then dated maintenance evidence. The last two are whether the code survives a YouTube frontend change, and how well it fits an existing stack.

Maintenance is the criterion that reshuffled the list. We read every repo's last push date and last release date from the API, then ran the code. A push in 2026 does not mean the extractor parsed the page in our August 11 test.

This ecosystem gives you one library per job. A March 2026 [dev.to post](https://dev.to/zaidkx37/i-built-an-open-source-youtube-scraper-for-python-no-api-key-needed-38nm) by Muhammad Zaid names the cost. He installed "3 different libraries, none of which played well together or supported async."

Only projects under OSI-approved licenses appear in the numbered ranking. Scrapfly's NPOSL-3.0 `youtube-scraper` sits outside that ranking as a source-available managed alternative: you can read and clone the code, but running it requires a Scrapfly API key.

This article ranks extraction engines and libraries, not the self-hosted download front ends that wrap an extractor behind a web UI.

An August 2024 [r/selfhosted thread](https://www.reddit.com/r/selfhosted/comments/1en5fg8/i_tried_some_of_the_many_youtube_downloaders/) compared nine of those front ends. The poster's own Edit3 line reads "yt-dlp is king and most, if not all, use it."

The thread is two years old and the poster flags it as personal opinion, so read it as a dated verdict. Sorting by job instead of by stars is how we approach [social media scraping tools](https://scrapfly.io/blog/posts/best-social-media-scraping-tools) elsewhere too.

The managed alternative is the one we can run live and print real output from.



## Managed Alternative: Scrapfly YouTube Scraper (Source-Available, NPOSL-3.0)

Scrapfly's [youtube-scraper](https://github.com/scrapfly/scrapfly-scrapers/tree/main/youtube-scraper) covers six YouTube surfaces from one directory. Video metadata, video comments, channel metadata, channel videos, search and Shorts metadata each get an async function in `youtube.py`.

Three files carry the whole module. `youtube.py` holds the parsing and `run.py` runs all six surfaces. `test.py` validates each result against a [Cerberus](https://docs.python-cerberus.org/) schema.

Both parsers query JSON rather than CSS classes. The video parser lifts the `ytInitialPlayerResponse` and `ytInitialData` blobs with `jsonpath-ng`, and the comments parser shapes each `commentEntityPayload` with [JMESPath](https://scrapfly.io/blog/posts/parse-json-jmespath-python).

Our [YouTube scraping guide](https://scrapfly.io/blog/posts/how-to-scrape-youtube) walks through both blob shapes and the InnerTube endpoints behind them.

The source is available to read and clone under NPOSL-3.0, and requests run through Scrapfly's [Web Scraping API](https://scrapfly.io/products/web-scraping-api). Running it requires a Scrapfly API key; the [free tier](https://scrapfly.io/pricing) covers a first run, and ongoing volume is paid.

`pyproject.toml` asks for Python 3.10 or newer, and the LICENSE file is NPOSL-3.0:

bash```bash
git clone https://github.com/scrapfly/scrapfly-scrapers.git
cd scrapfly-scrapers/youtube-scraper
export SCRAPFLY_KEY="YOUR_SCRAPFLY_KEY"
poetry install
poetry run python run.py
```



[Poetry](https://python-poetry.org/) pulls the dependencies, and the module reads `SCRAPFLY_KEY` from the environment. Here is the video path, trimmed to the fields it fills reliably:

python```python
import asyncio, json, os, re
from typing import Dict, List
from jsonpath_ng.ext import parse
from scrapfly import ScrapeApiResponse, ScrapeConfig, ScrapflyClient

SCRAPFLY = ScrapflyClient(key=os.environ["SCRAPFLY_KEY"])

BASE_CONFIG = {
    "asp": True,      # bypass YouTube's scraping blocking
    "country": "US",  # set the proxy country to US
}

jp_all = lambda query, data: [m.value for m in parse(query).find(data)]
jp_first = lambda query, data: (
    parse(query).find(data)[0].value if parse(query).find(data) else None
)


def parse_video(response: ScrapeApiResponse) -> Dict:
    """parse video and channel metadata from a YouTube watch page"""
    selector = response.selector
    # 1. videoDetails from the ytInitialPlayerResponse blob
    player = selector.xpath("//script[contains(text(),'ytInitialPlayerResponse')]/text()").get()
    details = json.loads(player.split(" = ")[1].split(";var")[0])["videoDetails"]
    # 2. page-level data from the ytInitialData blob
    raw = selector.xpath("//script[contains(text(),'ytInitialData')]/text()").get()
    content = json.loads(re.search(r"var ytInitialData = ({.*});", raw, re.DOTALL).group(1))

    likes = [i["title"] for i in jp_all("$..buttonViewModel", content) if i.get("iconName") == "LIKE"]
    channel_id = jp_first("$..channelEndpoint.browseEndpoint.canonicalBaseUrl", content)
    return {
        "video": {
            "videoId": details["videoId"],
            "title": details["title"],
            "publishingDate": jp_first("$..dateText.simpleText", content),
            "lengthSeconds": int(details["lengthSeconds"]),
            "description": details["shortDescription"],
            "thumbnail": details["thumbnail"]["thumbnails"],
            "stats": {
                "viewCount": int(details["viewCount"]),
                "likeCount": likes[0] if likes else None,
            },
        },
        "channel": {
            "name": details["author"],
            "identifierId": details["channelId"],
            "id": channel_id.replace("/", "") if channel_id else None,
            "channelUrl": f"https://www.youtube.com{channel_id}" if channel_id else None,
            "subscriberCount": jp_first("$..subscriberCountText.simpleText", content),
        },
        # this token feeds the comments API call in scrape_comments()
        "commentContinuationToken": jp_first("$..continuationCommand.token", content),
    }


async def scrape_video(ids: List[str]) -> List[Dict]:
    """scrape video metadata from YouTube watch pages"""
    to_scrape = [
        ScrapeConfig(
            f"https://youtu.be/{video_id}",
            render_js=True,
            proxy_pool="public_residential_pool",
            **BASE_CONFIG,
        )
        for video_id in ids
    ]
    data = []
    async for response in SCRAPFLY.concurrent_scrape(to_scrape):
        data.append(parse_video(response))
    return data


if __name__ == "__main__":
    print(json.dumps(asyncio.run(scrape_video(ids=["1Y-XvvWlyzk"])), indent=2))
```



Running that on August 11, 2026 printed one record per video ID, with the comment token that the comments function takes as input:

json```json
[
  {
    "video": {
      "videoId": "1Y-XvvWlyzk",
      "title": "Capture screenshots of any website using Scrapfly's Screenshot API - Introduction",
      "publishingDate": "Jul 9, 2024",
      "lengthSeconds": 271,
      "description": "introduction to Scrapfly's Screenshot API for capturing screenshots of websites on demand for data analysis and event tracking. ...",
      "thumbnail": [
        {
          "url": "https://i.ytimg.com/vi/1Y-XvvWlyzk/hqdefault.jpg?sqp=-oaymwEqCKgBEF5IWvKriqkDHQgBFQAAiEIYAdgBAeIBCggYEAIYBjgBQAG4AvMY&rs=AOn4CLAr0ZmJecjXayQL99f6nhByZFyf7A",
          "width": 168,
          "height": 94
        }
      ],
      "stats": {
        "viewCount": 1154,
        "likeCount": "8"
      }
    },
    "channel": {
      "name": "Scrapfly",
      "identifierId": "UCoX3U_dywuQf_KbLhWoUCmw",
      "id": "@scrapfly",
      "channelUrl": "https://www.youtube.com/@scrapfly",
      "subscriberCount": "105 subscribers"
    },
    "commentContinuationToken": "Eg0SCzFZLVh2dldseXprGAYyJSIRIgsxWS1YdnZX..."
  }
]
```



One request returned the video, the channel and the token in a single object. The like count and subscriber count arrive as display strings rather than integers, because that is how the page ships them.

The blocking work sits in two flags. `asp=True` handles the bot checks, and `render_js=True` runs the watch page in a real browser.

Six plain datacenter requests to the same page without `asp` returned three HTTP 429s. Four requests with `asp` returned 200 every time.

The README calls the code "fully documented and simplified for educational purposes".

So reach for the Scrapfly scraper when you need several YouTube surfaces in one codebase, and want the fetch layer handled for you. When you only need metadata and want to stay entirely local, the first ranked project is faster to start.



## 1. yt-dlp: Best for Bulk Video and Channel Metadata Extraction

[yt-dlp](https://github.com/yt-dlp/yt-dlp) is the standalone default for metadata at volume. It has 183,794 stars, an Unlicense, and release 2026.07.04, which makes it the most actively maintained Python extractor in this roster.

Most people know it as a downloader. Install it, then two flags turn it into a metadata reader that never touches the media file:

bash```bash
pip install yt-dlp
```



python```python
import json
import subprocess

VIDEO_URL = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"

# --dump-json prints one JSON object per video, --no-download skips the media
result = subprocess.run(
    ["yt-dlp", "--dump-json", "--no-download", VIDEO_URL],
    capture_output=True, text=True, check=True,
)
video = json.loads(result.stdout)

print(f"total fields:   {len(video)}")
for field in ["title", "channel", "channel_id", "upload_date", "duration",
              "view_count", "like_count", "comment_count"]:
    print(f"{field:15}{video.get(field)}")
print(f"{'tags':15}{video.get('tags', [])[:5]}")
print(f"{'subtitles':15}{len(video.get('subtitles', {}))} manual, "
      f"{len(video.get('automatic_captions', {}))} automatic caption tracks")
```



That ran on yt-dlp 2026.07.04 with no cookies, no proxy and no account:

text```text
total fields:   88
title          Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)
channel        Rick Astley
channel_id     UCuAXFkgsw1L7xaCfnd5JJOw
upload_date    20091025
duration       213
view_count     1802921514
like_count     19328378
comment_count  2400000
tags           ['rick astley', 'Never Gonna Give You Up', 'nggyu', 'never gonna give you up lyrics', 'rick rolled']
subtitles      5 manual, 157 automatic caption tracks
```



Eighty-eight top-level fields came back from one call, including the full caption-track inventory. But `comment_count` arrives rounded to 2400000, so treat it as an estimate rather than a number you can reconcile.

Comments are a separate flag and they need a cap. `--write-comments` with `--extractor-args "youtube:comment_sort=top;max_comments=5"` returns id, parent, text, like\_count, author, author\_is\_verified, timestamp and is\_pinned per comment.

Leave `max_comments` off and the fetch runs unbounded.

yt-dlp 2026.07.04 warns that YouTube extraction without an external JavaScript runtime is deprecated, and that some formats may be missing. [Deno](https://deno.com/) is the only runtime enabled by default.

Node, QuickJS and Bun need the `--js-runtimes` flag, per the [EJS wiki page](https://github.com/yt-dlp/yt-dlp/wiki/EJS). The metadata run above needed no runtime, so that deprecation bites format URLs rather than field extraction.

PO tokens draw the same line, and the [PO Token Guide](https://github.com/yt-dlp/yt-dlp/wiki/PO-Token-Guide) is specific. Without a token, those format URL requests "may return HTTP Error 403, or result in your account or IP address being blocked."

yt-dlp lists every caption track but never hands you the text, which is the next tool's whole job.



## 2. youtube-transcript-api: Best for Transcripts and Subtitles in Python

[youtube-transcript-api](https://github.com/jdepoix/youtube-transcript-api) does one job. It pulls the transcript text, manual or auto-generated, with no API key and no browser. Version 1.2.4 shipped in January 2026 under MIT, and the repo has 8,024 stars.

Version 1.x moved to an instance API, which breaks every older tutorial. The classmethods those tutorials show, `get_transcript` and `list_transcripts`, are gone and raise `AttributeError`:

bash```bash
pip install youtube-transcript-api
```



python```python
from youtube_transcript_api import YouTubeTranscriptApi

ytt = YouTubeTranscriptApi()
transcript = ytt.fetch("dQw4w9WgXcQ")

print(f"{transcript.language_code} | generated: {transcript.is_generated} | {len(transcript)} snippets")
for snippet in transcript.snippets[:3]:
    print(f"[{snippet.start:>6.2f}s] {snippet.text}")

for track in ytt.list("dQw4w9WgXcQ"):
    print(track.language_code, track.language, "generated" if track.is_generated else "manual")
```



Both calls answered an anonymous request from a residential connection in seconds:

text```text
en | generated: False | 61 snippets
[  1.36s] [♪♪♪]
[ 18.64s] ♪ We're no strangers to love ♪
[ 22.64s] ♪ You know the rules
and so do I ♪
en English manual
de-DE German (Germany) manual
ja Japanese manual
pt-BR Portuguese (Brazil) manual
es-419 Spanish (Latin America) manual
en English (auto-generated) generated
```



Each snippet carries `.text`, `.start` and `.duration`, which is enough to align quotes to timestamps. Snippet text can contain its own newlines, as the third line shows, so strip them before you index the text.

The README's own warning is about where you run the code. YouTube "has started blocking most IPs that are known to belong to cloud providers (like AWS, Google Cloud Platform, Azure, etc.)".

The library raises `RequestBlocked` or `IpBlocked` for those. The documented workaround is rotating residential proxies, because static ones get banned after extended use.

The library fits local work and [RAG pipelines](https://scrapfly.io/blog/posts/how-to-use-web-scaping-for-rag-applications) where you control the egress IP. Finding the videos to transcribe in the first place is a different surface.



## 3. scrapetube: Best for Lightweight Search Listing Without an API Key

[scrapetube](https://github.com/dermasmid/scrapetube) gets you a list of video IDs in four lines. It needs no API key, browser or auth. The search path still works, and that is the part you can ship:

bash```bash
pip install scrapetube
```



python```python
import scrapetube

# search is the one scrapetube surface that still returns rows
for video in scrapetube.get_search("web scraping", limit=5):
    print(video["videoId"], "https://www.youtube.com/watch?v=" + video["videoId"])
```



Five of five requested rows came back, twice in a row, on August 11, 2026:

text```text
taL3r_JpwBg https://www.youtube.com/watch?v=taL3r_JpwBg
hHQlcnubuFI https://www.youtube.com/watch?v=hHQlcnubuFI
aClnnoQK9G0 https://www.youtube.com/watch?v=aClnnoQK9G0
Ct8Gxo8StBU https://www.youtube.com/watch?v=Ct8Gxo8StBU
XVv6mJpFOb0 https://www.youtube.com/watch?v=XVv6mJpFOb0
```



`get_search` also takes `sort_by` and `results_type`. Asking for `channel` still returns rows, but `results_type="playlist"` came back empty on every query we tried. Each video row carries the video ID, a thumbnail list and the title, not full metadata.

The star count hides a bigger problem. `get_channel` returned zero rows for us by username and by URL, and `get_playlist` returned zero as well. No exception fires. The generator yields nothing, which is the worst failure shape for a data pipeline.

Upstream knows. Open issue #74, filed May 10, 2026, says YouTube moved channel videos into a `richItemRenderer` and `lockupViewModel` structure. It adds that "scrapetube only looks for the old `videoRenderer` format".

Issue #73 from April 2026 adds that the popular and oldest filters stopped working too.

Two pull requests with the fix have sat open since May 2026, and the last release is v2.6.0 from September 2025. Use scrapetube for search, and get channel listings from one of the maintained tools above.

Comments are the other single-purpose job, and that one has a maintained answer.



Scrapfly

#### Scale your web scraping effortlessly

Scrapfly handles proxies, browsers, and anti-bot bypass — so you can focus on data.

[Try Free →](https://scrapfly.io/register)## 4. youtube-comment-downloader: Best for Comment Threads Without the Data API

[youtube-comment-downloader](https://github.com/egbertbouman/youtube-comment-downloader) pulls comment threads from the command line with no Data API quota. It is the most recently released small project here, at 0.1.83 on July 30, 2026, the same day as its last push.

One command does the whole job, `youtube-comment-downloader --youtubeid dQw4w9WgXcQ --limit 5 --language en --output comments.jsonl`.

That returned five records in about two seconds, each with 11 fields including `cid`, `text`, `time`, `time_parsed`, `author`, `channel`, `votes`, `replies` and `heart`.

`--format` takes `jsonl`, `json`, `csv` or `scsv`, so the output drops straight into a dataframe. `--sort` defaults to recent comments; pass `0` for popular ones.

The `--language en` flag is not optional in practice. Without it, `time`, `votes` and `replies` come back localized to the request IP's language. And `time_parsed` silently drops off any record whose localized date string `dateparser` cannot read.

Also read `votes` and `replies` as strings, not counts. They arrive abbreviated, so a popular comment shows "298K" and a comment with no replies shows an empty string. Parse them before any [sentiment analysis](https://scrapfly.io/blog/posts/intro-to-using-web-scraping-for-sentiment-analysis) run that weights by engagement.

The live-stream equivalent is a single-purpose tool too, and it did not survive our testing.



## 5. chat-downloader: Best-Known Live Chat Tool, but It Failed Our August 11 Test

[chat-downloader](https://github.com/xenova/chat-downloader) is the only project in this roster that targets live chat and premiere messages. It reaches Twitch and past Zoom broadcasts as well, and it has 1,183 stars and a clean CLI with `--max_attempts`, `--retry_timeout` and `--inactivity_timeout`.

chat-downloader did not work in our August 11, 2026 test. Version 0.2.8, the current release, failed on all five live streams we pointed it at with `ParsingError: Unable to parse initial video data`. A sixth returned `VideoUnplayable`.

The issue tracker shows the same failure. A GitHub search for that error string returns 22 issues and pull requests. Eight are open issues filed between October 2025 and January 2026, none closed.

The one pull request aimed at the October 2025 continuation change has sat unmerged since November 2025.

The dates said as much before we ran it. The last release is v0.2.8 from September 3, 2023, nearly three years before this article. The repo pushed again in November 2025, which refreshes the date without shipping a fix.

Live chat is the one job on this list with no working open-source answer in our August 11, 2026 test. If you need it, budget for reading the unmerged patches yourself. The last entry leaves Python behind.



## 6. NewPipe Extractor: Best for the Java and Android Ecosystem

[NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor) is the only non-Python entry, and the freshest repo in the roster. It has 1,938 stars and pushed on August 10, 2026. Release v0.26.4 landed on July 20, 2026, the 83rd release overall.

Coverage is wide because a full Android client depends on it. The YouTube service alone ships 29 extractor classes, which cover channels, comments, playlists, search, streams, Music search and Shorts.

That Shorts coverage is the maintenance signal. `YoutubeShortsLockupInfoItemExtractor` and `YoutubeStreamInfoItemLockupExtractor` mean the project already tracks the `lockupViewModel` change that stopped scrapetube's channel listing.

The wrinkles are practical, not technical. Releases come through [JitPack](https://jitpack.io/) instead of Maven Central, with `implementation 'com.github.teamnewpipe:NewPipeExtractor:VERSION'`.

Android projects on a minSdk below 33 also need core library desugaring with `desugar_jdk_libs_nio`.

The license is the harder one. GPL-3.0 is a real constraint if you embed the library in a closed-source product. No permissive JVM alternative matches this coverage.

Those are the six worth your time. Three more still show up in tutorials and search results, and all three fail a live check.



## Which Old YouTube Scrapers Should You Avoid in 2026?

Three names dominate older YouTube scraping tutorials. Each one has a dated reason to skip it and a maintained replacement.

**pytube** fails the most basic call. Version 15.0.0 raised `HTTP Error 400: Bad Request` when we asked a plain watch URL for its title. On the identical URL, `pytubefix` 10.11.0 returned the title, view count and duration. The [pytube](https://github.com/pytube/pytube) repo last pushed in August 2024, and its newest PyPI release dates to May 2023.

Use [pytubefix](https://github.com/JuanBindez/pytubefix) instead. It is MIT, pushed August 9, 2026, and released 10.11.0 on July 29, 2026.

**youtube-dl** looks alive and is not shipping. The [youtube-dl](https://github.com/ytdl-org/youtube-dl) repo is not archived and last committed to master in November 2025. But its last release is 2021.12.17, and it carries 3,625 open issues. yt-dlp is the fork that took over.

**youtube-search-python** is not coming back. The [youtube-search-python](https://github.com/alexmercerind/youtube-search-python) repo is archived and read-only. Its last push landed on June 30, 2022. For search listings, use scrapetube's `get_search` or yt-dlp's `ytsearch` prefix.

[5 Best Open-Source Facebook Marketplace Scrapers on GitHub in 2026A dated, freshness-first roundup of the open-source Facebook Marketplace scrapers on GitHub worth cloning in 2026, and the dead repos to skip.](https://scrapfly.io/blog/posts/best-facebook-marketplace-scrapers-github)

Abandonment is what all three share, and the forces behind it reach the maintained tools too.



## Why Do Open-Source YouTube Scrapers Break (and How Do You Keep One Running)?

YouTube breaks scrapers in three ways, and only one of them is about parsing.

IP reputation comes first. Our own testing put three HTTP 429s in six plain datacenter requests to one watch page. Transcript libraries report the same from cloud provider ranges.

A script that runs fine on your laptop fails the week it lands in CI. Treat [IP rotation](https://scrapfly.io/blog/posts/how-to-avoid-web-scraping-blocking-ip-addresses) as part of the build, not a later fix.

The bot checks are next, and they are probabilistic rather than absolute. A tool can look healthy across ten manual runs and still drop a fifth of a nightly job.

Token requirements also land per client, so the same library can pass on one player client and get a 403 on another.

Frontend churn is the quiet one. YouTube moved channel listings from `videoRenderer` into a `richItemRenderer` and `lockupViewModel` shape, which emptied scrapetube's channel generator.

The channel home page HTML no longer carries the About panel. The panel comes from a [hidden endpoint](https://scrapfly.io/blog/posts/how-to-scrape-hidden-apis), which the `/about` URL returns inline as a `showEngagementPanelEndpoint` payload.

[11 Best Web Scraping APIs, Libraries, and Crawlers for Developers in 2026Compare the best web scraping tools in 2026. Pipeline-based guide covering Scrapfly, BeautifulSoup, Playwright, Scrapy, and more for production scraping.](https://scrapfly.io/blog/posts/best-web-scraping-apis)

So split the work where the failure rates differ. The open-source repo owns parsing, pagination and the data model, and those you can fix in an afternoon when a renderer name changes.

The fetch layer owns proxies, fingerprints and challenges, and that is the half that changes without warning and without a changelog. Handing it off is what keeps a weekend script running for a year.

## Power Your YouTube Scraper With Scrapfly

Every failure mode above lands on the fetch, and the fetch is what Scrapfly takes over.



ScrapFly's [Web Scraping API](https://scrapfly.io/products/web-scraping-api) collects public web data through one HTTP endpoint, with a **98% success rate on the hardest public pages** and residential and datacenter coverage in **190+ countries**.

- [Anti-Scraping Protection bypass](https://scrapfly.io/docs/scrape-api/anti-scraping-protection) - enables Scrapfly's managed anti-bot adaptation for supported public targets.
- [Smart proxy rotation](https://scrapfly.io/docs/scrape-api/proxy) - residential and datacenter pools with country and ASN level geo-targeting.
- [JavaScript rendering](https://scrapfly.io/docs/scrape-api/javascript-rendering) - render SPAs and dynamic pages through real cloud browsers.
- [Browser automation scenarios](https://scrapfly.io/docs/scrape-api/javascript-scenario) - scroll, click, fill forms, and wait for elements without managing a browser fleet.
- [Format conversion](https://scrapfly.io/docs/scrape-api/getting-started#api_param_format) - return pages as HTML, JSON, clean text, or LLM ready Markdown.
- [Session management](https://scrapfly.io/docs/scrape-api/session) - keep cookies, headers, and IPs consistent across multi step flows.
- [Smart caching](https://scrapfly.io/docs/scrape-api/getting-started#api_param_cache) - cache successful responses to cut cost on repeat scraping jobs.
- [Python](https://scrapfly.io/docs/sdk/python), [TypeScript](https://scrapfly.io/docs/sdk/typescript), [Rust](https://scrapfly.io/docs/sdk/rust), [Scrapy](https://scrapfly.io/docs/sdk/scrapy), and [no-code integrations](https://scrapfly.io/docs/integration/getting-started) including [Make](https://scrapfly.io/integration/make), [n8n](https://scrapfly.io/integration/n8n), [Zapier](https://scrapfly.io/integration/zapier), [LangChain](https://scrapfly.io/integration/langchain), and [LlamaIndex](https://scrapfly.io/integration/llamaindex).

You keep the source-available parsing code from the managed-alternative section and stop maintaining the stealth half of it.



### Web Scraping API

Scrape any website with our powerful API. Anti-bot bypass, JavaScript rendering, and rotating proxies built-in.



[Try Web Scraping API](https://scrapfly.io/docs/scrape-api/getting-started)



## FAQ

Is there a better YouTube scraper than yt-dlp?For metadata at volume on your own machine, no, and its release cadence is the reason. For channel, comment, and search data in one production codebase, Scrapfly's source-available NPOSL-3.0 managed alternative covers more surfaces but requires a Scrapfly API key.







How do I get YouTube video metadata and comments without downloading videos?Use `yt-dlp --dump-json --no-download` for metadata and `youtube-comment-downloader` for comment threads. Neither touches the media files or the Data API quota.







How do I get YouTube transcripts in Python?Install `youtube-transcript-api` and call `YouTubeTranscriptApi().fetch(video_id)`. Skip any tutorial still using the `get_transcript` classmethod, which was removed in version 1.x.







Do I need a YouTube Data API key to scrape YouTube?No. The six ranked projects read public pages or InnerTube endpoints without a YouTube Data API key. Scrapfly's managed alternative also avoids the Data API, but it requires a Scrapfly API key.







Is scraping YouTube legal?Scraping public data is generally lawful in the US and EU, while YouTube's Terms of Service prohibit automated access. Personal data and copyrighted content carry separate obligations under GDPR and copyright law.









## Summary

The best open-source YouTube scraper is the one shaped like your job. Use yt-dlp for bulk metadata, youtube-transcript-api for captions, and youtube-comment-downloader for comment threads.

Reach for scrapetube for a quick search listing and NewPipe Extractor on the JVM. When you need several surfaces behind a managed fetch layer, Scrapfly's source-available NPOSL-3.0 `youtube-scraper` is the unnumbered alternative.

Before you clone anything, check the last push date, the last release date, and whether the two agree. chat-downloader pushed in November 2025 and last released in 2023. scrapetube has 521 stars and an empty channel generator.

Then decide which half of the problem you want to own. Parsing is a day's work when YouTube renames a renderer, and blocking is a standing job with no end date.



Legal Disclaimer and PrecautionsThis tutorial covers popular web scraping techniques for education. Interacting with public servers requires diligence and respect:

- Do not scrape at rates that could damage the website.
- Do not scrape data that's not available publicly.
- Do not store PII of EU citizens protected by GDPR.
- Do not repurpose *entire* public datasets which can be illegal in some countries.

Scrapfly does not offer legal advice but these are good general rules to follow. For more you should consult a lawyer.

 

   [  Add as a preferred source ](https://google.com/preferences/source?q=scrapfly.io) Table of Contents















 

  Table of Contents- [Key Takeaways](#key-takeaways)
- [Which Open-Source YouTube Scraper Should You Use?](#which-open-source-youtube-scraper-should-you-use)
- [How Did We Rank These YouTube Scrapers?](#how-did-we-rank-these-youtube-scrapers)
- [Managed Alternative: Scrapfly YouTube Scraper (Source-Available, NPOSL-3.0)](#managed-alternative-scrapfly-youtube-scraper-source-available-nposl-3-0)
- [1. yt-dlp: Best for Bulk Video and Channel Metadata Extraction](#1-yt-dlp-best-for-bulk-video-and-channel-metadata-extraction)
- [2. youtube-transcript-api: Best for Transcripts and Subtitles in Python](#2-youtube-transcript-api-best-for-transcripts-and-subtitles-in-python)
- [3. scrapetube: Best for Lightweight Search Listing Without an API Key](#3-scrapetube-best-for-lightweight-search-listing-without-an-api-key)
- [4. youtube-comment-downloader: Best for Comment Threads Without the Data API](#4-youtube-comment-downloader-best-for-comment-threads-without-the-data-api)
- [5. chat-downloader: Best-Known Live Chat Tool, but It Failed Our August 11 Test](#5-chat-downloader-best-known-live-chat-tool-but-it-failed-our-august-11-test)
- [6. NewPipe Extractor: Best for the Java and Android Ecosystem](#6-newpipe-extractor-best-for-the-java-and-android-ecosystem)
- [Which Old YouTube Scrapers Should You Avoid in 2026?](#which-old-youtube-scrapers-should-you-avoid-in-2026)
- [Why Do Open-Source YouTube Scrapers Break (and How Do You Keep One Running)?](#why-do-open-source-youtube-scrapers-break-and-how-do-you-keep-one-running)
- [Power Your YouTube Scraper With Scrapfly](#power-your-youtube-scraper-with-scrapfly)
- [FAQ](#faq)
- [Summary](#summary)
 
    Join the Newsletter  Get monthly web scraping insights 

 

  



Scale Your Web Scraping

Anti-bot bypass, browser rendering, and rotating proxies, all in one API. Start with 1,000 free credits.

  No credit card required  1,000 free API credits  Anti-bot bypass included 

 [Start Free](https://scrapfly.io/register) [View Docs](https://scrapfly.io/docs/onboarding) 

 Not ready? Get our newsletter instead. 

 

 ## Related Articles

 [  

 python hidden-api 

### How to Scrape YouTube in 2026

Learn how to scrape YouTube channel, video, comment, and Shorts data in Python using hidden APIs and yt-dlp. No API key ...

 

 ](https://scrapfly.io/blog/posts/how-to-scrape-youtube) [     

 python hidden-api 

### 3 Best Open-Source Job Scrapers for Multi-Board Data in 2026

Three open-source job scrapers ranked by board coverage, schema, and dated maintenance, plus a source-available Scrapfly...

 

 ](https://scrapfly.io/blog/posts/best-open-source-job-scrapers) [     

 python scrapeguide 

### 5 Best Open-Source LinkedIn Scrapers on GitHub in 2026

Five open-source LinkedIn scraper repos on GitHub ranked by auth model, dated maintenance and honest ban risk, with live...

 

 ](https://scrapfly.io/blog/posts/best-linkedin-scrapers-github) 

  



   



 Scale your web scraping effortlessly, **1,000 free credits** [Start Free](https://scrapfly.io/register)