2012-10-10 28 views
5

Belirli bir videodaki tüm yorumları bir kerede bir sayfaya gitmek yerine almak istediğinizde.Tüm YouTube yorumları Python'un gdata modülüyle nasıl edinilir?

from gdata import youtube as yt 
from gdata.youtube import service as yts 

client = yts.YouTubeService() 
client.ClientLogin(username, pwd) #the pwd might need to be application specific fyi 

comments = client.GetYouTubeVideoComments(video_id='the_id') 
a_comment = comments.entry[0] 

tek yorumunu, muhtemelen en son yorumunu kapmak izin ile yukarıdaki kod ama aynı anda tüm yorumlarınızı kapmak için bir yol arıyorum. Bu Python'un gdata modülüyle mümkün mü? Birkaç bin olduğunda


Youtube API dosyaları comments için, yorum beslemesi docs ve Python API docs

+0

Bu yanıtlandı [burada] (http://stackoverflow.com/questions/10941803/using-youtube-api-to-get-all-comments-from-a-video-with-the-json-feed) PHP'yi kullanarak bir çözüm ile, YouTube PHP API'sine izin veren bir çağrı var. Saf Python cevabının orada olduğunu düşünmüyorum. –

+0

@KenB Bunu da gördüm. Bu utanç verici. Söz konusu videoda 9 bin yorum var ve 360'lık GetNextLink aramalarını yapmanın en iyi yol olduğunu düşünmüyorum. – TankorSmash

+1

'www.youtube.com/all_comments? V = video_id' URL'sinin ayrıştırılabilir bir yorum listesi vardır, ancak bu uzun bir yükleme süresidir. Sanırım bunu deneyebilirim. – TankorSmash

cevap

7

bs4 ile sonra şu sen Python YouTube API kullanmak için ne sordu başarır:

from gdata.youtube import service 

USERNAME = '[email protected]' 
PASSWORD = 'a_very_long_password' 
VIDEO_ID = 'wf_IIbT8HGk' 

def comments_generator(client, video_id): 
    comment_feed = client.GetYouTubeVideoCommentFeed(video_id=video_id) 
    while comment_feed is not None: 
     for comment in comment_feed.entry: 
      yield comment 
     next_link = comment_feed.GetNextLink() 
     if next_link is None: 
      comment_feed = None 
     else: 
      comment_feed = client.GetYouTubeVideoCommentFeed(next_link.href) 

client = service.YouTubeService() 
client.ClientLogin(USERNAME, PASSWORD) 

for comment in comments_generator(client, VIDEO_ID): 
    author_name = comment.author[0].name.text 
    text = comment.content.text 
    print("{}: {}".format(author_name, text)) 

Maalesef API için alınabilir giriş sayısını sınırlar. Aynı ilke API Diğer yemlerdeki girişlerini almak için geçerli olması gerektiğini

gdata.service.RequestError: {'status': 400, 'body': 'You cannot request beyond item 1000.', 'reason': 'Bad Request'} 

Not: Bu benim bir eliyle büküverilmiş versiyonunu çalıştığımızda aldığım hata GetYouTubeVideoCommentFeed URL parametresi hazırlanmış oldu. Eğer GetYouTubeVideoCommentFeed URL parametresini zanaat el istiyorsanız

, onun biçimi şöyledir:

'https://gdata.youtube.com/feeds/api/videos/{video_id}/comments?start-index={sta‌​rt_index}&max-results={max_results}' 

aşağıdaki kısıtlamalar geçerlidir: start-index <= 1000 ve max-results <= 50.

+1

Great ürününü bulursanız, dev araçlarını açın ve cevabımı düzenleyin. 'Start_index' veya' items_per_page' öğesini manuel olarak ayarlamanın bir yolu var mı? İlk yorum dizisinde ayar yapmak hiçbir şey yapmıyor gibi görünüyor. – TankorSmash

+1

Sadece GetYouTubeVideoCommentFeed' 'için aşağıdaki biçimde bir URL geçmesi gerekiyor:' https://gdata.youtube.com/feeds/api/videos/{video_id}/comments?start-index={start_index}&max-results = {MAX_RESULTS} '. Aşağıdaki kısıtlamalar geçerlidir: 'başlangıç-endeksi <= 1000' ve' max-results <= 50'. –

+0

Harika, URI'yi değiştirmeyi bile düşünmedin, şerefe! 'Yt_service.GetYouTubeVideoCommentFeed (uri = 'https: //gdata.youtube.com/feeds/...')' – TankorSmash

1

şimdilik var tek çözüm, ancak API kullanarak ve yavaş olur değil yorumlar. here görüldüğü gibi bir dict kullandığınız beri nedeniyle 'sınıfına' bir yerleşik piton adı olmasının, normal parametreler üzerinde, regex veya lambdas aracılığıyla 'startwith' için düzenli aramalar yapamaz

import bs4, re, urllib2 
#grab the page source for vide 
data = urllib2.urlopen(r'http://www.youtube.com/all_comments?v=video_id') #example XhFtHW4YB7M 
#pull out comments 
soup = bs4.BeautifulSoup(data) 
cmnts = soup.findAll(attrs={'class': 'comment yt-tile-default'}) 
#do something with them, ie count them 
print len(cmnts) 

Not . Ayrıca, BeautifulSoup nedeniyle oldukça yavaşlar, ancak etree ve minidom nedenlerinden dolayı eşleşen etiketleri bulamadığı için kullanılması gerekir. Hatta prettyfying()

+0

Merhaba, faiz cevabı ama html yapısının değiştiğini düşünüyorum. Comment yt-tile-default 'yerine alternatif bir etiket kullanıyor musunuz? Teşekkür ederim! – Thoth

+0

@Thoth Bunu bir süredir kullanmamıştım, ancak – TankorSmash