Python · YouTube

Python से YouTube वीडियो के आँकड़े मॉनिटर करें

YouTube किसी वीडियो की मौजूदा व्यू संख्या दिखाता है, लेकिन यह नहीं कि वह वहाँ तक कैसे पहुँची। अगर आप जानना चाहते हैं कि कोई वीडियो कितनी तेज़ी से बढ़ता है – आपका अपना, किसी प्रतिस्पर्धी का या कोई कैंपेन जिसके लिए आपने पैसे दिए – तो आपको आँकड़े नियमित रूप से दर्ज करने होंगे। यह गाइड एक छोटी स्क्रिप्ट बनाती है जो यह काम आपके लिए करती है।

दिन में एक बार यह everydata.io से आपकी लिस्ट के हर वीडियो के मौजूदा व्यू, लाइक और कमेंट माँगती है, एक CSV फ़ाइल में एक लाइन जोड़ती है और प्रिंट करती है कि पिछले रन के बाद से हर वीडियो को कितने व्यू मिले। वैकल्पिक रूप से यह किसी चैनल के सबसे नए अपलोड भी उठा लेती है, ताकि नए वीडियो पहले दिन से ट्रैक हों।

अपडेट: · everydata.io द्वारा

आख़िर में आपके पास क्या होगा

  • हर वीडियो और दिन के लिए एक पंक्ति वाली CSV फ़ाइल: व्यू, लाइक, कमेंट।
  • पिछली जाँच के बाद से व्यू में बढ़ोतरी, हर रन पर प्रिंट की हुई।
  • किसी चैनल के नए अपलोड की ऑटोमैटिक ट्रैकिंग।

आपको क्या चाहिए

  • Python 3.10 या नया और pip install requests।
  • everydata.io की फ़्री API key – यहाँ बनाएँ – EVERYDATA_API_KEY environment variable में।
  • वे वीडियो जिन पर आप नज़र रखना चाहते हैं: लिंक में v= के बाद वाला ID, या पूरा लिंक।

01देखें कि API एक वीडियो के लिए क्या लौटाता है

video-details endpoint, id में वीडियो ID या लिंक लेता है और वीडियो पेज के सार्वजनिक आँकड़े लौटाता है। छोटा किया गया डॉक्यूमेंटेड उदाहरण:

उदाहरण रिस्पॉन्स · GET /ytb/youtube-video-details
{
  "responseStatus": "PAGE_FOUND",
  "responseMessage": "Page successfully found!",
  "videoId": "kJQP7kiw5Fk",
  "title": "Luis Fonsi - Despacito ft. Daddy Yankee",
  "channelName": "LuisFonsiVEVO",
  "viewCount": 9125159593,
  "likeCount": 56673581,
  "likeCountText": "56M",
  "commentCount": 4300000,
  "publishedAt": "2017-01-12T21:00:02-08:00",
  "duration": 282
}

viewCount, likeCount और commentCount सादे नंबर हैं, सेव और तुलना करने के लिए तैयार। likeCountText वह गोल किया लेबल है जो YouTube पेज पर दिखाता है।

02हर रन पर आँकड़े दर्ज करें

स्क्रिप्ट CSV फ़ाइल से हर वीडियो की आख़िरी व्यू संख्या पढ़ती है, मौजूदा आँकड़े फ़ेच करती है, एक नई पंक्ति जोड़ती है और अंतर प्रिंट करती है।

monitor.py
"""Record views, likes and comments of YouTube videos and print the growth since the last check."""
import csv
import os
import re
import time
from datetime import datetime, timezone
from pathlib import Path

import requests

API = "https://api.everydata.io"
KEY = os.environ["EVERYDATA_API_KEY"]
CSV_FILE = Path("video_stats.csv")
VIDEOS = ["kJQP7kiw5Fk"]  # video IDs or full YouTube links


def api_get(path: str, params: dict) -> dict:
    """GET an everydata.io endpoint. Waits when rate limited (429) and retries a failed page load (5xx) once."""
    retried = False
    for _ in range(4):
        resp = requests.get(f"{API}{path}", params=params, headers={"x-api-key": KEY}, timeout=60)
        if resp.status_code == 429:
            # Too many requests at once. The answer says how long to wait: "... Try again in 12 seconds."
            wait = re.search(r"in (\d+) seconds", resp.text)
            time.sleep(int(wait.group(1)) + 1 if wait else 60)
            continue
        if resp.status_code >= 500 and not retried:
            retried = True  # 5xx answers are not counted against your quota
            time.sleep(10)
            continue
        resp.raise_for_status()  # 4xx (wrong key, quota used up, bad parameter) or a second 5xx
        return resp.json()
    raise RuntimeError("still rate limited after several waits – try again later")


def video_details(video: str) -> dict:
    return api_get("/ytb/youtube-video-details", {"id": video})


def last_views() -> dict[str, int]:
    """Most recent view count per video from earlier runs."""
    if not CSV_FILE.exists():
        return {}
    with CSV_FILE.open(newline="") as f:
        return {r["video_id"]: int(r["views"]) for r in csv.DictReader(f) if r["views"]}


def main() -> None:
    before = last_views()
    now = datetime.now(timezone.utc).isoformat(timespec="seconds")
    new_file = not CSV_FILE.exists()

    with CSV_FILE.open("a", newline="") as f:
        writer = csv.writer(f)
        if new_file:
            writer.writerow(["checked_at", "video_id", "title", "views", "likes", "comments"])
        for video in VIDEOS:
            try:
                v = video_details(video)
            except (requests.RequestException, RuntimeError) as exc:
                print(f"{video}: could not check this time ({exc}) – the next run tries again")
                continue  # one failed video does not stop the others
            video_id = v.get("videoId") or video
            views = v.get("viewCount")
            writer.writerow([now, video_id, v.get("title"), views or "",
                             v.get("likeCount") or "", v.get("commentCount") or ""])
            if views is not None and video_id in before:
                print(f"{v.get('title')}: +{views - before[video_id]:,} views since the last check")


if __name__ == "__main__":
    main()

इसे python3 monitor.py से चलाएँ। दूसरे रन से आपको “+12,345 views since the last check” जैसी लाइनें दिखेंगी। जब आप एक साथ बहुत ज़्यादा रिक्वेस्ट भेजते हैं (429) तो api_get रुकता है और आगे बढ़ता है, और विफल पेज लोड (5xx) को एक बार और आज़माता है; जो वीडियो फिर भी विफल हो, उसकी रिपोर्ट होती है और अगले रन में उसे फिर उठाया जाता है।

03किसी चैनल के नए वीडियो उठाएँ

हर नया वीडियो हाथ से जोड़ने के बजाय किसी चैनल के सबसे नए अपलोड माँगें और उन्हें लिस्ट में शामिल करें। channel-videos endpoint, चैनल ID या चैनल लिंक स्वीकार करता है।

monitor.py (video_details के नीचे जोड़ें)
def latest_uploads(channel: str) -> list[str]:
    """IDs of the newest regular videos of a channel (channel ID or URL such as https://www.youtube.com/@WWE)."""
    data = api_get("/ytb/youtube-channel-videos", {"id": channel, "filter": "videos_latest"})
    return [item["videoId"] for item in data.get("items", []) if item.get("type") == "video"]


# In main(): watch the five newest uploads of a channel as well as your fixed list
# for video in VIDEOS + latest_uploads("https://www.youtube.com/@WWE")[:5]:
उदाहरण रिस्पॉन्स · GET /ytb/youtube-channel-videos
{
  "responseStatus": "PAGE_FOUND",
  "responseMessage": "Page successfully found!",
  "channelId": "UCJ5v_MCY6GNUBTO8-D3XoAg",
  "filter": "videos_latest",
  "items": [
    {
      "type": "video",
      "videoId": "b7kl_pcHa0A",
      "title": "Blake Monroe vows to get payback against Giulia: SmackDown exclusive, Sept. 18, 2026",
      "viewCount": 6800,
      "publishedTimeText": "47 minutes ago"
    }
  ]
}

04इसे दिन में एक बार चलाएँ

स्क्रिप्ट को cron (Mac, Linux), Windows Task Scheduler या किसी शेड्यूल किए गए CI जॉब से शेड्यूल करें:

crontab
0 6 * * * cd /home/you/yt-monitor && EVERYDATA_API_KEY=ds_your_key /usr/bin/python3 monitor.py >> monitor.log 2>&1

हर वीडियो लुकअप और हर चैनल लुकअप एक रिक्वेस्ट है। उदाहरण के लिए, दिन में एक बार जाँचे जाने वाले तीन वीडियो हर महीने लगभग 90 रिक्वेस्ट हैं, जो 100 वाले फ़्री प्लान के भीतर हैं। कई वीडियो के दैनिक आँकड़ों के लिए प्राइसिंग देखें।

ग्रोथ कर्व देखने के लिए video_stats.csv को स्प्रेडशीट में खोलें और checked_at के सामने व्यू प्लॉट करें।

इस गाइड में इस्तेमाल किए गए endpoints

GET/ytb/youtube-video-details

Video Details · YouTube API

GET/ytb/youtube-channel-videos

Channel Videos · YouTube API

API रेफ़रेंस में सभी पैरामीटर

अपने डेटा के साथ आज़माएँ

फ़्री प्लान में हर महीने 100 रिक्वेस्ट शामिल हैं, हर प्लेटफ़ॉर्म पर इस्तेमाल करने लायक – इस गाइड को शुरू से आख़िर तक फ़ॉलो करने के लिए काफ़ी।