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!
Daftar Isi
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:
- Mengunduh video YouTube - Menggunakan yt-dlp untuk mengunduh video dari URL tertentu.
- Mengekstrak komentar YouTube - Ekstrak komentar dari video YouTube menggunakan yt-dlp.
- Mengekstraksi metadata - Mengambil metadata (misalnya judul, lebar, tinggi, bahasa, saluran, suka) dari video YouTube tanpa mengunduhnya.
- 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.
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 True
Artinya 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.
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-wrapper
yang 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)