2013-03-19 27 views
5

Tôi muốn nhận tất cả url video của một kênh cụ thể. Tôi nghĩ rằng json với python hoặc java sẽ là một lựa chọn tốt. Tôi có thể tải video mới nhất bằng mã sau đây, nhưng làm cách nào tôi có thể nhận được TẤT CẢ các liên kết video (> 500)?python: nhận tất cả url video trên youtube của một kênh

import urllib, json 
author = 'Youtube_Username' 
inp = urllib.urlopen(r'http://gdata.youtube.com/feeds/api/videos?max-results=1&alt=json&orderby=published&author=' + author) 
resp = json.load(inp) 
inp.close() 
first = resp['feed']['entry'][0] 
print first['title'] # video title 
print first['link'][0]['href'] #url 

Trả lời

9

Tăng max-kết quả từ 1 tới tuy nhiên nhiều bạn muốn, nhưng hãy cẩn thận họ không tư vấn cho grabbing quá nhiều trong một cuộc gọi và sẽ hạn chế bạn ở 50 (https://developers.google.com/youtube/2.0/developers_guide_protocol_api_query_parameters).

Thay vào đó, bạn có thể xem xét việc lấy dữ liệu xuống theo lô 25, giả sử bằng cách thay đổi chỉ mục bắt đầu cho đến khi không có gì trở lại.

EDIT: Đây là mã cho làm thế nào tôi sẽ làm điều đó

import urllib, json 
author = 'Youtube_Username' 

foundAll = False 
ind = 1 
videos = [] 
while not foundAll: 
    inp = urllib.urlopen(r'http://gdata.youtube.com/feeds/api/videos?start-index={0}&max-results=50&alt=json&orderby=published&author={1}'.format(ind, author)) 
    try: 
     resp = json.load(inp) 
     inp.close() 
     returnedVideos = resp['feed']['entry'] 
     for video in returnedVideos: 
      videos.append(video) 

     ind += 50 
     print len(videos) 
     if (len(returnedVideos) < 50): 
      foundAll = True 
    except: 
     #catch the case where the number of videos in the channel is a multiple of 50 
     print "error" 
     foundAll = True 

for video in videos: 
    print video['title'] # video title 
    print video['link'][0]['href'] #url 
+1

Tốt câu trả lời, nhưng nó sẽ là tốt hơn để sử dụng một cái gì đó như "trừ SpecificError" và không phải là một ngoại lệ chung: nếu có những vấn đề khác với tải json hoặc với phân tích phản ứng, mã loại này sẽ ẩn chúng. –

+1

Điểm tốt, nếu áp phích quyết định sử dụng nó thì chắc chắn là một ý tưởng tốt để làm một số nghiên cứu và tìm lỗi cụ thể –

+0

Nếu bạn xóa: in len (video) thì bạn sẽ gặp lỗi ... vì vậy tôi nghĩ sẽ cần khắc phục điều đó. –

6

Dựa trên mã tìm thấy ở đây và ở một số nơi khác, tôi đã viết một kịch bản nhỏ mà thực hiện điều này. Tập lệnh của tôi sử dụng v3 API của Youtube và không đạt đến giới hạn 500 kết quả mà Google đã đặt cho các tìm kiếm.

Mã này hiện có sẵn trên tại GitHub:. https://github.com/dsebastien/youtubeChannelVideosFinder

+1

Cảm ơn vì điều này. Kết hợp với [pafy] (https://github.com/mps-youtube/pafy), bạn có thể tìm nạp tất cả các video trên một kênh. – Jabba

+2

điều này đã không làm việc cho kênh PyCon 2015 hoặc thậm chí ví dụ được đề cập trên git, nó chỉ nói rằng kênh không tìm thấy. Tôi có làm điều gì sai. –

1

Sau khi thay đổi youtube API, max k câu trả lời của không hoạt động. Để thay thế, chức năng bên dưới cung cấp danh sách các video trên youtube trong một kênh nhất định. Xin lưu ý rằng bạn cần API Key để thiết bị hoạt động.

import urllib 
import json 

def get_all_video_in_channel(channel_id): 
    api_key = YOUR API KEY 

    base_video_url = 'https://www.youtube.com/watch?v=' 
    base_search_url = 'https://www.googleapis.com/youtube/v3/search?' 

    first_url = base_search_url+'key={}&channelId={}&part=snippet,id&order=date&maxResults=25'.format(api_key, channel_id) 

    video_links = [] 
    url = first_url 
    while True: 
     inp = urllib.urlopen(url) 
     resp = json.load(inp) 

     for i in resp['items']: 
      if i['id']['kind'] == "youtube#video": 
       video_links.append(base_video_url + i['id']['videoId']) 

     try: 
      next_page_token = resp['nextPageToken'] 
      url = first_url + '&pageToken={}'.format(next_page_token) 
     except: 
      break 
    return video_links 
Các vấn đề liên quan