2012-10-10 11 views
5

एक समय में एक पृष्ठ जाने के बजाए किसी दिए गए वीडियो से सभी टिप्पणियां लेना चाहते हैं।पाइथन के gdata मॉड्यूल के साथ सभी YouTube टिप्पणियां कैसे प्राप्त करें?

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] 

आप एक ही टिप्पणी की संभावना सबसे हाल ही में टिप्पणी हड़पने जाने के साथ ऊपर कोड है, लेकिन मैं एक ही बार में सभी टिप्पणियां हड़पने के लिए एक रास्ता तलाश कर रहा हूँ। क्या यह पाइथन के gdata मॉड्यूल के साथ संभव है? comments के लिए


यूट्यूब एपीआई डॉक्स, टिप्पणी फ़ीड docs और अजगर एपीआई docs

+0

यह उत्तर दिया गया था [यहां] (http://stackoverflow.com/questions/10941803/using-youtube-api-to-get-all-comments-from-a-video-with-the-json-feed) PHP का उपयोग करने के समाधान के साथ, चूंकि YouTube PHP API में एक कॉल है जो इसे अनुमति देता है। मुझे नहीं लगता कि एक शुद्ध पायथन जवाब बाहर है। –

+0

@ केएनबी मैंने इसे भी देखा। कि एक शर्म की बात है। प्रश्न में वीडियो में 9 के टिप्पणियां हैं और मुझे नहीं लगता कि 360 'GetNextLink' कॉल करना सबसे अच्छा तरीका है। – TankorSmash

+1

यूआरएल 'www.youtube.com/all_comments? V = video_id' में एक पारदर्शी टिप्पणी सूची है, लेकिन यह एक लंबा लोड समय है। मान लीजिए कि मैं कोशिश कर सकता हूं। – TankorSmash

उत्तर

7

के बाद निम्नलिखित को प्राप्त होता है आप Python YouTube API प्रयोग करने के लिए क्या पूछा:

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)) 

दुर्भाग्य एपीआई प्रविष्टियों की संख्या कि को पुनः प्राप्त किया जा सकता है की सीमा।

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

ध्यान दें कि इसी सिद्धांत एपीआई के अन्य फीड में प्रविष्टियों को पुनः प्राप्त करने के लिए आवेदन करना चाहिए: यह त्रुटि मुझे मिल गया जब मैं एक हाथ से एक ट्वीक संस्करण की कोशिश की गढ़ी GetYouTubeVideoCommentFeed URL पैरामीटर था।

आप GetYouTubeVideoCommentFeed URL पैरामीटर शिल्प हाथ चाहते हैं, इसके प्रारूप है:

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

निम्नलिखित प्रतिबंध लागू होते हैं: start-index <= 1000 और max-results <= 50

+1

ग्रेट पाते हैं तो देव उपकरण खोलें और मेरा जवाब संपादित करें। क्या आपको पता है कि 'start_index' या' items_per_page' मैन्युअल रूप से सेट करने का कोई तरीका है या नहीं? टिप्पणियों के पहले सेट पर इसे सेट करना कुछ भी नहीं लगता है। – TankorSmash

+1

आपको 'GetYouTubeVideoCommentFeed'' के लिए निम्न प्रारूप के साथ एक यूआरएल पास करने की जरूरत है: 'https://gdata.youtube.com/feeds/api/videos/{video_id}/comments?start-index={start_index}&max-results = {} MAX_RESULTS '। निम्नलिखित प्रतिबंध लागू होते हैं: 'स्टार्ट-इंडेक्स <= 1000' और' अधिकतम-परिणाम <= 50'। –

+0

ग्रेट, यूआरआई, चीयर्स को बदलने का भी विचार नहीं किया! – TankorSmash

1

एकमात्र समाधान मैं अब के लिए मिल गया है, लेकिन यह एपीआई का उपयोग नहीं कर रहा है और धीमी गति से हो जाता है जब वहाँ कई हजार टिप्पणियाँ।

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) 

ध्यान दें कि 'क्लास' अंतर्निहित अजगर नाम न होने के कारण आप regex या lambdas के माध्यम से 'startwith' के लिए नियमित रूप से खोज कर सकते हैं नहीं के रूप में here देखा, जब से तुम एक dict का उपयोग कर रहे, नियमित रूप से मानकों से अधिक । सुंदर सूप के कारण यह बहुत धीमी हो जाती है, लेकिन इसे उपयोग करने की आवश्यकता है क्योंकि etree और minidom किसी कारण से मिलान टैग नहीं ढूंढते हैं। यहां तक ​​कि prettyfying()bs4 साथ

+0

हाय, ब्याज का जवाब लेकिन मुझे लगता है कि एचटीएमएल संरचना बदल गई है। क्या आप 'टिप्पणी yt-tile-default'' के बजाय वैकल्पिक टैग का उपयोग करते हैं? धन्यवाद! – Thoth

+0

@ थॉथ मैंने थोड़ी देर में इसका उपयोग नहीं किया है, लेकिन यदि आप – TankorSmash

संबंधित मुद्दे