tr
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
한국인
Italiano
Gaeilge
اردو
Indonesia
Polski YouTube içerik oluşturucuları, her videonun nasıl performans gösterdiğini analiz etmek zorundadır; bu, hem yorumları hem de içerik oluşturucunun kendi içeriğini aynı veya farklı bir kategorideki diğer videolarla ilişkili olarak analiz etmeyi içerir.
Tüm videoları manuel olarak gözden geçirmek yorucu ve zor olabilir. Bu senaryoda özel bir komut dosyası işe yarayacaktır. Bu kılavuzda, YouTube'u nasıl kazıyacağınızı ve genellikle manuel olarak gerçekleştirilen veri toplama sürecini otomatikleştirmeyi amaçlayan böyle bir komut dosyasını nasıl oluşturacağınızı göstereceğiz.
YouTube'u nasıl kazıyacağımızı öğrenmeden önce yapısını anlamamız gerekir. Kullanıcı etkinlikleri ve video istatistikleriyle ilgili olarak aralarından seçim yapabileceğiniz sonsuz sayıda veri türüne sahip pek çok özelliği vardır. Platformdaki bazı temel parametreler arasında video başlıkları ve açıklamaları, eklenen etiketler, görüntüleme miktarı, beğeniler ve yorumların yanı sıra kanal ve oynatma listesi bilgileri yer alır. Bu unsurlar, içerik pazarlamacıları ve içerik oluşturucuları için videoların performanslarını değerlendirmek ve video içeriğinin nasıl formüle edileceğine dair strateji oluşturmak açısından önemlidir.
YouTube Veri API'si ile geliştiriciler metriklerin çoğuna programlı olarak erişebilir. API ayrıca abone sayılarının yanı sıra kanaldaki videolara da erişim sağlar ve bu da analiz ve entegrasyon amaçları için iyi miktarda veri sağlar.
Bununla birlikte, API aracılığıyla elde edilmesi imkansız olan ve bu nedenle yalnızca web kazıma yoluyla alınabilecek bazı belirli unsurlar olabilir. Örneğin, yorumlarının duyarlılığı veya etkileşimde bulundukları belirli zaman gibi bazı ayrıntılı izleyici katılımı metriklerini elde etmek, Youtube sayfalarını web kazıma yaklaşımları gerektirecektir. Bu teknik genellikle daha karmaşıktır ve platformun sürekli gelişen içerik sunumunun yanı sıra veri kazıma konusundaki katı düzenlemeleri nedeniyle riskler taşıyabilir.
Aşağıdaki bloklarda size bir betiğin nasıl oluşturulacağını ve Python'da Youtube'dan nasıl verimli bir şekilde veri kazıyacağınızı göstereceğiz.
Python ile Youtube videolarını kazımak için, IP yasaklarından ve botların geçişini önleme yöntemlerinden kaçınmak için proxy kullanımı çok önemlidir. İşte bazı türleri ve açıklamaları:
Bu türleri stratejik olarak kullanırken, Youtube'dan tespit edilmeden veri kazımak mümkündür ve platformun Hizmet Şartlarına uyarken verilere sürekli erişime izin verir. Ayrıca, bunları doğru bir şekilde anlamak, bir web sitesi bulmanız gerektiğinde size çok yardımcı olacaktır. kazıma için proxy.
Script oluşturarak Youtube'u nasıl kazıyacağımıza başlayalım, yüklenmesi gereken bazı paketler var. İlk olarak Selenium'un bir proxy uzantısı olan ve aynı zamanda bazı anahtar sınıflara ve modüllere sahip olan Selenium-wire'ı yükleyeceğiz. Bu paketleri yüklemek için komut arayüzünüzde aşağıdaki komut dizisini kullanın:
pip install selenium-wire selenium blinker==1.7.0
Şimdi dikkatimizi ithalata çevirelim.
Bu noktada, betiklerin yazıldığı web öğelerine yönelik kütüphaneleri ve paketleri yüklememiz gerekir. Ek olarak, betiğin verimli bir şekilde yürütülmesini sağlamak için veri işleme ve çalışma zamanı yönetimi için modüller eklemeliyiz.
from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import json
import time
Json modülü, kazınan verileri daha iyi sunum için uygun şekilde biçimlendirilmiş JSON verilerine dönüştürmeye ve ip adresimizi maskelemeye yardımcı olur. Bununla birlikte, zaman modülü eylemleri gizlemek ve aşırı tahmin edilebilir davranışların tespit edilmesi durumunda rastgelelik sağlamak için kullanılır.
Ayrıca, verilerden çıkarılması gereken gerekli öğelerin sayfada zaten bulunduğundan emin olunmasına da yardımcı olur. İçe aktarmaların geri kalanı, daha sonra kodun diğer bölümlerinde tartışılacak olan farklı şeyler yapan gerekli sınıflar veya alt modüllerdir.
Bir Selenium örneği Python'da yazılmış bir komut dosyasından tetiklendiğinde, komut dosyası kendi başına gerçekleştirmesi gereken tüm görevler için IP'mizi kullanacaktır. Bu, YouTube gibi sitelerinden bilgi kazıyan bazı siteler için gerçekten sorunlu olabilir. Daha iyi anlamak için web sitelerinin robotlar dosyasını incelemeniz tavsiye edilir. Sonuç olarak, örneğin Youtube kanallarını kazımaya çalışırken IP'nizin geçici olarak yasaklanmasının sonuçlarına katlanabilirsiniz.
Tüm bu zorlukları hafifletmek için yapmamız gereken birkaç şey var. İlk olarak, kullanacağımız proxy'nin ayrıntılarını üç değişkenin temeli olarak saklamalıyız. Ardından, kazıma sırasında hangi proxy'nin kullanılması gerektiğini bildirmek için selenium.Chrome() örneğine aktarılacak olan chrome_options adlı bir seçenek değişkeni tanımlıyoruz. Proxy bilgisi, chrome_options'a gerekli argümanlar geçirilerek ayarlanır. İşte proxy komut dosyası ile Youtube'u nasıl kazıyacağınız:
# Proxy sunucu adresini kullanıcı adı ve parola ile belirtin
proxy_address = ""
proxy_username = ""
proxy_password = ""
# Proxy ve kimlik doğrulama ile Chrome seçeneklerini ayarlama
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')
# selenium-wire ile bir WebDriver örneği oluşturma
driver = wiredriver.Chrome(options=chrome_options)
YouTube ana sayfasının adresini tutmak için "youtube_url_to_scrape" adında bir değişken oluşturun. Bu değişken Selenium için "driver.get()" yönteminde kullanılır, böylece kazıma amacıyla hangi belirli web sayfasına gidileceğini bilir. Bu eylem, komut dosyası yürütüldüğünde yeni bir Chrome penceresinin açılmasına neden olacaktır.
youtube_url_to_scrape = ""
# Selenium otomasyonunuzu selenium-wire'ın gelişmiş özellikleriyle gerçekleştirin
driver.get(youtube_url_to_scrape)
Aşağıda, sayfadan adına göre bilgi çıkarma işlemini gerçekleştiren "extract _information()" fonksiyonunu açıklıyoruz.
Sayfadaki tüm öğelerin yüklendiğinden emin olduk. Bu, örnek "daha fazla" düğmesiyle temsil edilen öğe kullanılabilir olana ve tıklanana kadar komut dosyasını askıya almak için WebDriverWait ile birlikte WebDriver API kullanılarak gerçekleştirilir. Tıklandığında, Selenium videonun tam açıklaması için bir JavaScript tıklaması gerçekleştirir.
Bunu düzeltmek için, ilgili sorunları ortadan kaldıracak bir çözüm uyguluyoruz. Actions sınıfını ve Time modülünü kullanarak, her 10 saniyede bir iki kez aşağı kaydırıyoruz ve YouTube yorumlarını mümkün olduğunca çok kazımaya dikkat ediyoruz. Bu, dinamik olarak yüklenen içerikle ilgili herhangi bir sorun yaşanmamasını sağlıyor.
def extract_information() -> dict:
try:
element = WebDriverWait(driver, 15).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="expand"]'))
)
element.click()
time.sleep(10)
actions = ActionChains(driver)
actions.send_keys(Keys.END).perform()
time.sleep(10)
actions.send_keys(Keys.END).perform()
time.sleep(10)
Selenium WebDriver kullanarak, öğeleri aramak için farklı yollar vardır. Diğerlerinin yanı sıra ID'ye, CLASS_NAME'e, XPATH'e göre arama yapılabilir. Bu Python dersinde Youtube'dan nasıl veri kazıyacağımızı anlatmak için tek bir yol yerine bunları birleştireceğiz.
XPATH kazınacak değişkenleri bulmak için daha karmaşık bir sistemdir çünkü daha kalıp odaklı görünmektedir. Gerçekten de en zoru olarak kabul edilir, ancak en azından Chrome söz konusu olduğunda değil.
Koda göz atarken tek yapılması gereken, Chrome'un denetleme bölümünden sağ tıklayarak yapılabilen XPATH kopyala seçeneğine tıklamak ve seçmektir. XPATH alındıktan sonra, videonun başlığı, açıklaması vb. gibi ilgili ayrıntılara sahip tüm bileşenleri aramak için 'find_elements' yöntemi kolayca kullanılabilir.
Web sayfasındaki bazı özelliklerin yinelenen özelliklere sahip olabileceğini ve bu nedenle temel 'find_elements()' tekniğini kullanmanın size bir dize yerine bir liste vereceğini belirtmek önemlidir. Bu senaryoda, listeyi kontrol etmeniz ve hangi dizinin gerekli bilgilere sahip olduğunu ve hangi metnin alınması gerektiğini belirlemeniz gerekir.
Sonuç olarak, "data" adlı bir sözlük değişkeni döndürülür ve kazıma sırasında toplanan tüm bilgileri kapsar, dolayısıyla bir sonraki bölüm için gereklidir.
video_title = driver.find_elements(By.XPATH, '//*[@id="title"]/h1')[0].text
owner = driver.find_elements(By.XPATH, '//*[@id="text"]/a')[0].text
total_number_of_subscribers = \
driver.find_elements(By.XPATH, "//div[@id='upload-info']//yt-formatted-string[@id='owner-sub-count']")[
0].text
video_description = driver.find_elements(By.XPATH, '//*[@id="description-inline-expander"]/yt-attributed-string/span/span')
result = []
for i in video_description:
result.append(i.text)
description = ''.join(result)
publish_date = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[2].text
total_views = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[0].text
number_of_likes = driver.find_elements(By.XPATH, '//*[@id="top-level-buttons-computed"]/segmented-like-dislike-button-view-model/yt-smartimation/div/div/like-button-view-model/toggle-button-view-model/button-view-model/button/div')[
1].text
comment_names = driver.find_elements(By.XPATH, '//*[@id="author-text"]/span')
comment_content = driver.find_elements(By.XPATH, '//*[@id="content-text"]/span')
comment_library = []
for each in range(len(comment_names)):
name = comment_names[each].text
content = comment_content[each].text
indie_comment = {
'name': name,
'comment': content
}
comment_library.append(indie_comment)
data = {
'owner': owner,
'subscribers': total_number_of_subscribers,
'video_title': video_title,
'description': description,
'date': publish_date,
'views': total_views,
'likes': number_of_likes,
'comments': comment_library
}
return data
except Exception as err:
print(f"Error: {err}")
def organize_write_data(data:dict):
output = json.dumps(data, indent=2, ensure_ascii=False).encode("ascii", "ignore").decode("utf-8")
try:
with open("output.json", 'w', encoding='utf-8') as file:
file.write(output)
except Exception as err:
print(f"Error encountered: {err}")
"organize_write_data" adlı kullanıcı tanımlı bir fonksiyon, bir önceki işlemden elde edilen "veri" çıktısını kabul etmek üzere tasarlanmıştır. Ana görevi, verileri JSON formatında yapılandırmak ve dosyaya yazma aşamasında doğru prosedürlerin izlenmesini sağlarken output.json adlı bir dosyaya yazmaktır.
Şimdi, Youtube'u nasıl düzgün bir şekilde kazıyacağımızı anlıyoruz. Şimdiye kadar, kazıma programımızın tam kodu burada:
from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
import json
import time
# Proxy sunucu adresini kullanıcı adı ve parola ile belirtin
proxy_address = ""
proxy_username = ""
proxy_password = ""
# Proxy ve kimlik doğrulama ile Chrome seçeneklerini ayarlama
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')
# selenium-wire ile bir WebDriver örneği oluşturma
driver = wiredriver.Chrome(options=chrome_options)
youtube_url_to_scrape = ""
# Selenium otomasyonunuzu selenium-wire'ın gelişmiş özellikleriyle gerçekleştirin
driver.get(youtube_url_to_scrape)
def extract_information() -> dict:
try:
element = WebDriverWait(driver, 15).until(
EC.presence_of_element_located((By.XPATH, '//*[@id="expand"]'))
)
element.click()
time.sleep(10)
actions = ActionChains(driver)
actions.send_keys(Keys.END).perform()
time.sleep(10)
actions.send_keys(Keys.END).perform()
time.sleep(10)
video_title = driver.find_elements(By.XPATH, '//*[@id="title"]/h1')[0].text
owner = driver.find_elements(By.XPATH, '//*[@id="text"]/a')[0].text
total_number_of_subscribers = \
driver.find_elements(By.XPATH, "//div[@id='upload-info']//yt-formatted-string[@id='owner-sub-count']")[
0].text
video_description = driver.find_elements(By.XPATH,
'//*[@id="description-inline-expander"]/yt-attributed-string/span/span')
result = []
for i in video_description:
result.append(i.text)
description = ''.join(result)
publish_date = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[2].text
total_views = driver.find_elements(By.XPATH, '//*[@id="info"]/span')[0].text
number_of_likes = driver.find_elements(By.XPATH,
'//*[@id="top-level-buttons-computed"]/segmented-like-dislike-button-view-model/yt-smartimation/div/div/like-button-view-model/toggle-button-view-model/button-view-model/button/div')[
1].text
comment_names = driver.find_elements(By.XPATH, '//*[@id="author-text"]/span')
comment_content = driver.find_elements(By.XPATH,
'//*[@id="content-text"]/span')
comment_library = []
for each in range(len(comment_names)):
name = comment_names[each].text
content = comment_content[each].text
indie_comment = {
'name': name,
'comment': content
}
comment_library.append(indie_comment)
data = {
'owner': owner,
'subscribers': total_number_of_subscribers,
'video_title': video_title,
'description': description,
'date': publish_date,
'views': total_views,
'likes': number_of_likes,
'comments': comment_library
}
return data
except Exception as err:
print(f"Error: {err}")
# Verileri JSON'a kaydetme
def organize_write_data(data: dict):
output = json.dumps(data, indent=2, ensure_ascii=False).encode("ascii", "ignore").decode("utf-8")
try:
with open("output.json", 'w', encoding='utf-8') as file:
file.write(output)
except Exception as err:
print(f"Error encountered: {err}")
organize_write_data(extract_information())
driver.quit()
Artık Python ile Youtube yorumlarını nasıl kazıyacağımızı da biliyoruz. Çıktı şu şekilde görünüyor:
{
"owner": "Suzie Taylor",
"subscribers": "165K subscribers",
"video_title": "I Spent $185,000 From MrBeast",
"description": "@MrBeast blessed me with $185,000, after SURVIVING 100 DAYS trapped with a STRANGER. Now I want to bless you!\nGive This A Like if you Enjoyed :))\n-\nTo Enter The Giveaway: \nFollow me on Instagram: https://www.instagram.com/sooztaylor/...\nSubscribe to me on Youtube: \n / @suzietaylor \nI am picking winners for the giveaway ONE WEEK from today (December 23rd) \n-\nThank you everyone for all of your love already. This is my dream!",
"date": "Dec 16, 2023",
"views": "4,605,785 ",
"likes": "230K",
"comments": [
{
"name": "",
"comment": "The right person got the money "
},
{
"name": "@Scottster",
"comment": "Way to go Suzie, a worthy winner! Always the thought that counts and you put a lot into it!"
},
{
"name": "@cidsx",
"comment": "I'm so glad that she's paying it forward! She 100% deserved the reward"
},
{
"name": "@Basicskill720",
"comment": "This is amazing Suzie. Way to spread kindness in this dark world. It is much needed !"
},
{
"name": "@eliasnull",
"comment": "You are such a blessing Suzie! The world needs more people like you."
},
{
"name": "@iceline22",
"comment": "That's so awesome you're paying it forward! You seem so genuine, and happy to pass along your good fortune! Amazing! Keep it up!"
},
{
"name": "",
"comment": "Always nice to see a Mr. Beast winner turn around and doing nice things for others. I know this was but a small portion of what you won and nobody expects you to not take care of yourself with that money, but to give back even in small ways can mean so much. Thank you for doing this."
}
]
}
Platformun kurallarıyla uyumlu kalmaya yardımcı olan otomasyon veya proxy komut dosyalarını kullanırken YouTube'daki veritabanı bilgilerinden yararlanma yeteneği inanılmaz derecede değerlidir. Yukarıda açıkladığımız Youtube'un nasıl kazınacağına ilişkin ana yaklaşım, platform tarafından yasaklanmaktan veya sınırlandırılmaktan kaçınırken verilerin sorumlu bir şekilde toplanması için yararlı olacaktır.
Yorumlar: 0