python: получить все Youtube видео URL-адреса канала
Я хочу получить все url-адреса видео определенного канала. Я думаю, что json с python или java будет хорошим выбором. Я могу получить новейшее видео со следующим кодом, но как я могу получить все ссылки на видео (>500)?
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
4 ответов
увеличить max-результаты от 1 до сколько угодно, но будьте осторожны, они не советуют хватать слишком много за один вызов и ограничат вас в 50 (https://developers.google.com/youtube/2.0/developers_guide_protocol_api_query_parameters).
вместо этого вы можете рассмотреть возможность захвата данных партиями по 25, скажем, путем изменения начального индекса, пока никто не вернется.
EDIT: вот код для того, как я бы это сделал
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
на основе кода здесь и в некоторых других местах, я написал небольшой скрипт, который делает это. Мой скрипт использует V3 API Youtube и не попадает в предел 500 результатов, который Google установил для поиска.
код доступен на GitHub:https://github.com/dsebastien/youtubeChannelVideosFinder
после изменения API youtube ответ max k. не работает. В качестве замены, функция ниже предоставляет список видео youtube в данном канале. Обратите внимание, что вам нужно ключ API для его работы.
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
независимый способ делать вещи.
import requests
username = "marquesbrownlee"
url = "https://www.youtube.com/user/username/videos"
page = requests.get(url).content
data = str(page).split(' ')
item = 'href="/watch?'
vids = [line.replace('href="', 'youtube.com') for line in data if item in line] # list of all videos listed twice
print(vids[0]) # index the latest video