Beranda BlogPengikisan web Cara mengikis data YouTube menggunakan Python

Cara mengikis data YouTube menggunakan Python

oleh Kadek

Dalam artikel hari ini Anda akan mempelajari cara:

  • Gunakan Python dan perpustakaan yt-dlp untuk mengekstrak metadata video dan mengunduh video
  • Ekspor informasi penting ini ke file CSV
  • Gunakan ScraperAPI untuk secara efektif melewati tindakan anti-scraping YouTube dan mengumpulkan data yang lebih komprehensif

Bersiaplah untuk meningkatkan keterampilan pengumpulan data Anda dan manfaatkan kekayaan informasi yang tersedia di YouTube!

TL;DR: Pengikis YouTube lengkap

Bagi yang datang bersama Pengikisan web atau terbiasa mengotomatiskan tugas dengan Python, skrip ini memberikan panduan komprehensif untuk mengambil berbagai jenis data YouTube.

Berikut ringkasan singkat tentang fungsi kode:

  1. Mengunduh video YouTube - Menggunakan yt-dlp untuk mengunduh video dari URL tertentu.
  2. Mengekstrak komentar YouTube - Ekstrak komentar dari video YouTube menggunakan yt-dlp.
  3. Mengekstraksi metadata - Mengambil metadata (misalnya judul, lebar, tinggi, bahasa, saluran, suka) dari video YouTube tanpa mengunduhnya.
  4. Mengikis informasi saluran - Menggunakan Permintaan dan BeautifulSoup untuk mencari bagian Tentang saluran YouTube dan mengekstrak nama dan deskripsi saluran.
  import requests
  from yt_dlp import YoutubeDL
  from bs4 import BeautifulSoup
  
  ## Downloading a YouTube Video
  def download_video(video_url):
      opts = {}
      with YoutubeDL(opts) as yt:
          yt.download((video_url))
      print(f"Downloaded video: {video_url}")
  
  ## Extracting YouTube Comments    
  def extract_comments(video_url):
      opts = {"getcomments": True}
      with YoutubeDL(opts) as yt:
          info = yt.extract_info(video_url, download=False)
          comments = info("comments")
          thread_count = info("comment_count")
          print("Number of threads: {}".format(thread_count))
          for comment in comments:
              print(comment('text'))
  
  ## Extracting Metadata
  def extract_metadata(video_url):
      opts = {}
      with YoutubeDL(opts) as yt:
          info = yt.extract_info(video_url, download=False)
          data = {
              "URL": video_url,
              "Title": info.get("title"),
              "Width": info.get("width"),
              "Height": info.get("height"),
              "Language": info.get("language"),
              "Channel": info.get("channel"),
              "Likes": info.get("like_count")
          }
          print("Metadata:", data)
          return data
  
  ## Scraping Channel Information
  def scrape_channel_info(channel_url, api_key):
      params = {
          'api_key': api_key,
          'url': channel_url,
          'render': 'true'
      }
      response = requests.get('https://api.scraperapi.com', params=params)
      if response.status_code == 200:
          soup = BeautifulSoup(response.text, 'html.parser')
          channel_name = soup.find('yt-formatted-string', {'id': 'text', "class":"style-scope ytd-channel-name"})
          channel_desc = soup.find('div', {'id': 'wrapper', "class":"style-scope ytd-channel-tagline-renderer"})
          if channel_name and channel_desc:
              channel_info = {
                  "channel_name": channel_name.text.strip(),
                  "channel_desc": channel_desc.text.strip(),
              }
              print("Channel Info:", channel_info)
              return channel_info
          else:
              print("Failed to retrieve channel info")
      else:
          print("Failed to retrieve the page:", response.status_code)
  
  ## Example Usage
  if __name__ == "__main__":
      # Download a video
      video_url =  "ANY_YOUTUBE_VIDEO_URL"
      download_video(video_url)
  
      # Extract comments
      video_url_for_comments = "https://www.youtube.com/watch?v=hzXabRASYs8"
      extract_comments(video_url_for_comments)
  
      # Extract metadata
      video_url_for_metadata = "ANY_YOUTUBE_VIDEO_URL"
      extract_metadata(video_url_for_metadata)
  
      # Scrape channel information
      api_key = 'YOUR_API_KEY'
      channel_url = 'https://www.youtube.com/@scraperapi/about'
      scrape_channel_info(channel_url, api_key)

Kode ini menyediakan cara komprehensif untuk mengikis dan menganalisis berbagai jenis data YouTube menggunakan Python. Pertama ganti nilai placeholder (mis. YOUR_API_KEY, ANY_YOUTUBE_VIDEO_URL) dengan data aktual Anda.

Ingin mendalami lebih dalam tentang pengikisan YouTube? Lanjut membaca!

Panduan langkah demi langkah untuk mengambil data YouTube

Persyaratan proyek

Berikut adalah alat dan perpustakaan yang Anda perlukan untuk proyek ini:

  • Python 3.8 atau lebih baru – Pastikan Anda menginstal versi terbaru
  • yt-dlp – Untuk mengunduh video YouTube
  • ScraperAPI – Untuk membantu web scraping tanpa diblokir
  • Permintaan – Pustaka HTTP sederhana untuk Python
  • Sup yang enak4 – Untuk mengurai HTML dan mengekstrak data yang diperlukan
  • Jason – Untuk memproses data JSON

Langkah 1: Siapkan proyek Anda

Mari kita mulai dengan menyiapkan lingkungan proyek Anda. Pertama, buat direktori baru untuk mengatur semuanya dan navigasikan ke sana.

Buka terminal Anda dan jalankan perintah ini:

  mkdir youtube-scraper
  cd youtube-scraper

Pastikan Python diinstal pada sistem Anda - diperlukan Python 3.8 atau lebih baru. Sekarang mari kita instal perpustakaan penting untuk mengunduh dan mengambil data YouTube.

Gunakan perintah berikut untuk menginstal perpustakaan:

  pip install yt-dlp requests beautifulsoup4

Dengan langkah-langkah ini, direktori proyek Anda sudah siap dan Anda telah menginstal semua alat yang diperlukan untuk mulai mengunduh dan mengambil data YouTube.

Sekarang mari selami bagian yang menarik!

Langkah 2: Unduh Video YouTube dengan Python

Kami menggunakannya yt_dlp Perpustakaan untuk mengunduh video YouTube. Pustaka ini adalah alat yang ampuh untuk berinteraksi dengan konten YouTube menggunakan Python.

Pertama kita tentukan URL video YouTube yang ingin kita download. Anda bisa video_url Variabel dengan URL video YouTube apa pun yang ingin Anda unduh.

  from yt_dlp import YoutubeDL

  video_url = "https://www.youtube.com/watch?v=xy5OQ2IWNtc"

Kami kemudian menyiapkan opsi untuk pengunduh menggunakan kamus Python. Dalam cuplikan ini kami telah memberikan dua opsi:

  • 'format': 'best': Opsi ini memerintahkan pengunduh untuk memilih format kualitas terbaik yang tersedia untuk video tersebut
  • 'outtmpl': '%(title)s.%(ext)s': Opsi ini menentukan templat nama file keluaran. Di Sini %(title)s diganti dengan judul video dan %(ext)s digantikan oleh ekstensi file (misalnya mp4, webm).
  # Set options for the downloader
  opts = {
      'format': 'best',  # Choose the best quality format available
      'outtmpl': '%(title)s.%(ext)s'  # Output template for the filename
  }

Akhirnya kami membuatnya YoutubeDL Tolak dengan opsi yang diberikan dan gunakan untuk mengunduh video dengan download() Metode. Metode ini menerima daftar URL sebagai parameter, memungkinkan Anda mengunduh banyak video sekaligus.

Berikut cuplikan kode lengkapnya:

  # Create a YoutubeDL object and download the video
  with YoutubeDL(opts) as yt:
      yt.download((video_url))

Dengan menjalankan cuplikan kode ini, Anda dapat mendownload video YouTube yang ditentukan dengan kualitas dan template nama file yang Anda inginkan.

Langkah 3: Hapus metadata YouTube

Catatan penting

Informasi yang diberikan di sini hanya untuk tujuan pendidikan. Panduan ini tidak memberikan hak apa pun atas video atau gambar, yang mungkin dilindungi oleh hak cipta, kekayaan intelektual, atau hak hukum lainnya. Sebelum mengunduh konten apa pun, harap berkonsultasi dengan penasihat hukum dan baca ketentuan penggunaan situs web.

Tanpa mendownload video kita bisa yt_dlp Perpustakaan untuk mendapatkan detail tentang video YouTube, seperti judul, ukuran, saluran, dan bahasa.

Sebagai contoh, mari kita lihat detail video ini dengan extract_info() Metode, pengaturan download parameter False agar kita tidak mendownload videonya lagi. Metode ini mengembalikan kamus dengan semua informasi tentang video tersebut.

Lihat detail video dari YouTubeLihat detail video dari YouTube

Berikut cuplikan untuk mengekstrak data:

  from yt_dlp import YoutubeDL

  video_url = "https://www.youtube.com/watch?v=xy5OQ2IWNtc"
  opts = dict()
  
  with YoutubeDL(opts) as yt:
      info = yt.extract_info(video_url, download=False)
      video_title = info.get("title")
      width = info.get("width")
      height = info.get("height")
      language = info.get("language")
      channel = info.get("channel")
      likes = info.get("like_count")
      
      data = {
          "URL": video_url,
          "Title": video_title,
          "Width": width,
          "Height": height,
          "Language": language,
          "Channel": channel,
          "Likes": likes
      }
      print(data)

Untuk mendapatkan detail lebih lanjut tentang video tersebut, Anda dapat menggunakan kunci lain dari kamus yang dikembalikan oleh extract_info(). Berikut ini beberapa yang berguna:

Kunci elemen
id ID Video
title Judul video
description Deskripsi Video
uploader Nama pengunggah
uploader_id ID Pengunggah
upload_date Tanggal pengunggahan (YYYYMMDD)
duration Durasi dalam hitungan detik
view_count Jumlah penayangan
like_count Jumlah suka
dislike_count Jumlah tidak suka
comment_count Jumlah komentar
thumbnail URL gambar kecil
formats Daftar format yang tersedia
subtitles Subtitle yang tersedia
age_limit Batasan usia
categories Kategori yang terkait dengan video
tags Tag yang terkait dengan video
is_live Jika video tersebut adalah siaran langsung

Dengan menggunakan tombol ini, Anda bisa mendapatkan semua informasi yang diperlukan tentang video YouTube.

Langkah 4: Hapus komentar YouTube

Untuk mengekstrak komentar dari video YouTube, kami menggunakan yt_dlp Perpustakaan untuk mengekstrak komentar tanpa mengunduh video itu sendiri.

Dalam contoh ini, kami akan mengikis komentar dari video ini: Pengenalan Singkat Git untuk Pemula

Pertama kita mengimpor YoutubeDL kelas dari yt_dlp Library dan tentukan URL video YouTube yang ingin kita scrap:

  from yt_dlp import YoutubeDL

  # URL of the YouTube video
  video_url = "https://www.youtube.com/watch?v=r8jQ9hVA2qs"

Selanjutnya, mari buat kamus opsi opts dengan kuncinya "getcomments" mengatur TrueArtinya yt_dlp yang ingin kami ekstrak komentarnya:

  # Options for YoutubeDL to get comments
  opts = {
      "getcomments": True,
  }

Penggunaan YoutubeDL Sesuai dengan opsi yang kami tentukan, kami mengekstrak informasi video, termasuk komentar, dengan memanggil extract_info() Metode yang kami gunakan sebelumnya.

Ingat download parameter False Oleh karena itu, kami hanya mengambil metadata dan komentar tanpa mendownload video sebenarnya:

  # Extract video information, including comments

  with YoutubeDL(opts) as yt:
      info = yt.extract_info(video_url, download=False)
  

Selanjutnya kita menggunakan get() Metode pada kamus dengan kunci "comments" untuk mengakses komentar. Kami juga menentukan jumlah total rangkaian komentar dengan kuncinya "comment_count":

  # Get the comments
  comments = info.get("comments")
  thread_count = info("comment_count")

Terakhir, kami mencetak jumlah total rangkaian komentar dan komentar itu sendiri:

  print("Number of threads: {}".format(thread_count))
  print(comments)

Berikut kode lengkapnya bersama-sama:

  from yt_dlp import YoutubeDL

  # URL of the YouTube video
  video_url = "https://www.youtube.com/watch?v=hzXabRASYs8"
  
  # Options for YoutubeDL to get comments
  opts = {
      "getcomments": True,
  }
  
  # Extract video information, including comments
  with YoutubeDL(opts) as yt:
      info = yt.extract_info(video_url, download=False)
      
      # Get the comments
      comments = info.get("comments")
      thread_count = info("comment_count")
      
      # Print the number of comment threads and the comments
      print("Number of threads: {}".format(thread_count))
      print(comments)

Langkah 5: Kikis informasi saluran YouTube

Untuk mendapatkan informasi tentang saluran YouTube, kita dapat menggunakan ScraperAPI untuk menghindari pemblokiran, Pustaka Permintaan untuk memproses permintaan HTTP, dan Pustaka BeautifulSoup untuk mengurai konten HTML.

Untuk contoh ini, kami mencari halaman “Tentang” saluran YouTube ScraperAPI dan mengekstrak nama dan deskripsi saluran.

Mengikis informasi saluran YouTubeMengikis informasi saluran YouTube

Pertama, kami menyiapkan kunci API untuk ScraperAPI dan URL halaman Tentang saluran YouTube.

Catatan: Tidak punya kunci API? Buat akun ScraperAPI gratis dan dapatkan 5.000 kredit API untuk menguji semua alat kami.

Kami juga menentukan parameter yang diperlukan untuk permintaan API; itu render Parameter akan aktif true memungkinkan tampilan lengkap semua JavaScript di situs web:

  api_key = 'YOUR_API_KEY'
  url = f'https://www.youtube.com/@scraperapi/about'
  params = {
      'api_key': api_key,
      'url': url,
      'render': 'true'
  }

Kalau begitu, kita akan melakukannya get() Permintaan ke titik akhir ScraperAPI, meneruskan parameter kami. Hal ini memungkinkan kami untuk melewati semua batasan dan mendapatkan konten HTML halaman:

  response = requests.get('https://api.scraperapi.com', params=params)

Jika permintaan berhasil (kode status 200), kami menggunakan BeautifulSoup untuk mengurai konten HTML dan mengekstrak nama dan deskripsi saluran. Kami menemukan elemen-elemen ini menggunakan tag dan kelas HTML spesifiknya yang kami identifikasi sebelumnya:

  if response.status_code == 200:
  soup = BeautifulSoup(response.text, 'html.parser')
  channel_name = soup.find('yt-formatted-string', {'id': 'text', "class":"style-scope ytd-channel-name"})
  channel_desc = soup.find('div', {'id': 'wrapper', "class":"style-scope ytd-channel-tagline-renderer"})
  if channel_name and info:       
      channel_info = {
      " channel_name" : channel_name.text.strip(),
      "channel_desc" : channel_desc.text.strip(),
      }
  else:
      print("Failed to retrieve channel info")
else:
  print("Failed to retrieve the page:", response.status_code)

Terakhir, kami mencetak informasi saluran yang diekstraksi:

Berikut kode lengkapnya:

  import requests
  from bs4 import BeautifulSoup
  
  # API key for ScraperAPI
  api_key = 'YOUR_API_KEY'
  # URL of the YouTube channel's About page
  url = 'https://www.youtube.com/@scraperapi/about'
  # Parameters for the API request
  params = {
      'api_key': api_key,
      'url': url,
      'render': 'true'
  }
  
  # Make a GET request to ScraperAPI
  response = requests.get('https://api.scraperapi.com', params=params)
  
  # If the request is successful, parse the HTML and extract the channel info
  if response.status_code == 200:
      soup = BeautifulSoup(response.text, 'html.parser')
      channel_name = soup.find('yt-formatted-string', {'id': 'text', 'class': 'style-scope ytd-channel-name'})
      channel_desc = soup.find('div', {'id': 'wrapper', 'class': 'style-scope ytd-channel-tagline-renderer'})
  
      channel_info = {
          'channel_name': channel_name.text.strip(),
          'channel_desc': channel_desc.text.strip(),
      }
  else:
      print("Failed to retrieve the page:", response.status_code)
  
  # Print the extracted channel information
  print(channel_info)

Menggunakan ScraperAPI memudahkan pengambilan konten web. Ini membantu kami mengambil data dari situs seperti YouTube yang mungkin memiliki batasan.

ScraperAPI menangani semua kerumitan web scraping, seperti: Seperti mengelola rotasi IP, menangani CAPTCHA, dan merender JavaScript, yang seringkali dapat memblokir teknik web scraping tradisional. Hal ini memungkinkan kami untuk fokus mengekstrak data yang kami perlukan tanpa harus mengkhawatirkan masalah umum ini.

Misalnya, YouTube sering kali menggunakan berbagai mekanisme untuk mencegah akses otomatis, termasuk pembatasan kecepatan dan struktur halaman kompleks yang memerlukan rendering JavaScript. Dengan menggunakan ScraperAPI, kami dapat dengan mudah melewati batasan ini, memungkinkan kami mengambil data seperti informasi saluran, detail video, dan komentar tanpa diblokir.

Cara mengikis hasil pencarian YouTube

Mengikis hasil pencarian YouTube dapat memberikan wawasan berharga tentang konten populer dan tren terkait kata kunci tertentu. Dalam contoh ini, kami menggunakan ScraperAPI untuk mengambil hasil penelusuran YouTube teratas untuk kueri “scraperapi” dan mengekstrak judul serta tautan video.

Pertama kita mengimpor perpustakaan yang diperlukan:

  import requests
  from bs4 import BeautifulSoup
  import json

Selanjutnya, kami menyiapkan kunci ScraperAPI dan menentukan permintaan pencarian. Kami juga membuat URL untuk halaman hasil pencarian YouTube:

  api_key = 'YOUR_API_KEY'
  search_query = 'scraperapi'
  url = f'https://www.youtube.com/results?search_query={search_query}'
  params = {
      'api_key': api_key,
      'url': url,
      'render': 'true',
  }

Kami menginisialisasi daftar kosong yang disebut video_data untuk menyimpan informasi video yang diekstraksi dan membuat permintaan ke titik akhir ScraperAPI dengan parameter kami. Ini memungkinkan kami mendapatkan konten HTML dari halaman hasil pencarian:

  video_data = ()
  response = requests.get('https://api.scraperapi.com', params=params)

Jika permintaan berhasil (kode status 200), kami juga mengurai konten HTML Sup yang enak:

  if response.status_code == 200:
  soup = BeautifulSoup(response.text, 'html.parser')
  videos = soup.find_all('div', {"id": "title-wrapper"})

Kita gunakan soup.find_all() ke semua elemen div dengan id dari title-wrapperyang berisi judul video dan link.

  videos = soup.find_all('div', {"id": "title-wrapper"})

Kami kemudian memeriksa apakah elemen video ditemukan. Saat video ditemukan, kami mencetak jumlah video yang ditemukan dan menelusuri setiap item untuk mengekstrak judul dan tautan.

Kami mendapatkannya title Atribut tag jangkar yang berisi judul video dan href Atribut tag jangkar yang berisi URL relatif video. Kami menggabungkannya dengan URL dasar “https://www.youtube.com” untuk membentuk URL lengkap.

Kami kemudian menyimpan judul dan tautan yang diekstraksi dalam kamus dan menambahkannya ke video_data Daftar.

  if videos:
  print(f"Found {len(videos)} videos")

  for video in videos:
      video_details = video.find("a", {"id": "video-title"})
      if video_details:
          title = video_details.get('title')
          link = video_details('href')
          video_info = {"title": title, "link": f"https://www.youtube.com{link}"}
          video_data.append(video_info)

Setelah mengekstrak semua detail video, kami menyimpannya video_data Daftar ke dalam file JSON untuk digunakan lebih lanjut.

  with open('videos.json', 'w') as json_file:
  json.dump(video_data, json_file, indent=4)

Berikut kode lengkapnya:

  import requests
  from bs4 import BeautifulSoup
  import json
  
  # API key for ScraperAPI
  api_key = 'YOUR_API_KEY'
  # Search query for YouTube
  search_query = 'scraperapi'
  # URL of the YouTube search results page
  url = f'https://www.youtube.com/results?search_query={search_query}'
  # Parameters for the API request
  params = {
      'api_key': api_key,
      'url': url,
      'render': 'true',
  }
  
  # Initialize an empty list to store video data
  video_data = ()
  # Make a GET request to ScraperAPI
  response = requests.get('https://api.scraperapi.com', params=params)
  
  # If the request is successful, parse the HTML and extract video info
  if response.status_code == 200:
      soup = BeautifulSoup(response.text, 'html.parser')
      videos = soup.find_all('div', {"id": "title-wrapper"})
      
      if videos:
          print(f"Found {len(videos)} videos")
          for video in videos:
              video_details = video.find("a", {"id": "video-title"})
              if video_details:
                  title = video_details.get('title')
                  link = video_details('href')
                  video_info = {"title": title, "link": f"https://www.youtube.com{link}"}
                  video_data.append(video_info)
          
          # Save the extracted video data to a JSON file
          with open('videos.json', 'w') as json_file:
              json.dump(video_data, json_file, indent=4)
      else:
          print("No videos found")
  else:
      print("Failed to retrieve the page:", response.status_code)

Pos terkait

Tinggalkan Komentar