我想获取特定频道的所有视频网址。我认为使用python或java的json将是一个不错的选择。我可以使用以下代码获取最新视频,但如何获得所有视频链接(> 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
答案 0 :(得分:10)
将最大结果从1增加到你想要的多少,但要注意他们不建议在一次通话中抓取太多,并将你限制在50(https://developers.google.com/youtube/2.0/developers_guide_protocol_api_query_parameters)。
相反,您可以考虑通过更改start-index直到没有回来来批量抓取25个数据。
编辑:这是我将如何做的代码
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 :(得分:6)
根据此处和其他地方的代码,我编写了一个小脚本来执行此操作。我的脚本使用的是Youtube API的v3,但没有达到Google为搜索设置的500个结果限制。
该代码可在GitHub上获取:https://github.com/dsebastien/youtubeChannelVideosFinder
答案 2 :(得分:4)
在youtube API更改后,max k。的答案无效。作为替代,以下功能提供了给定频道中的YouTube视频列表。请注意,您需要API Key才能使用。
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
答案 3 :(得分:2)
这里有一个可以帮助解决这个问题的库。
pip install list_youtube_channel
import list_youtube_channel
videos = list_youtube_channel.get_channel("UC9-y-6csu5WGm29I7JiwpnA")
for video in videos:
print(video['videoId'])
答案 4 :(得分:1)
独立的做事方式。没有api,没有速率限制。
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
上面的代码将仅废弃有限数量的视频网址,最大数量为60。如何获取频道中存在的所有视频网址。你能建议一下吗?
上面的代码段将仅显示两次列出的所有视频的列表。并非所有视频网址都在频道中。
答案 5 :(得分:0)
使用Selenium Chrome驱动程序:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import time
driverPath = ChromeDriverManager().install()
driver = webdriver.Chrome(driverPath)
url = 'https://www.youtube.com/howitshouldhaveended/videos'
driver.get(url)
height = driver.execute_script("return document.documentElement.scrollHeight")
previousHeight = -1
while previousHeight < height:
previousHeight = height
driver.execute_script(f'window.scrollTo(0,{height + 10000})')
time.sleep(1)
height = driver.execute_script("return document.documentElement.scrollHeight")
vidElements = driver.find_elements_by_id('thumbnail')
vid_urls = []
for v in vidElements:
vid_urls.append(v.get_attribute('href'))
此代码在我尝试过几次后才起作用;但是,您可能需要调整睡眠时间,或者添加一种方法来识别浏览器何时仍在加载额外信息。它对于我来说很容易就能获得包含300多个视频的频道,但是由于在浏览器中加载新视频所需的时间变得不一致,因此拥有7000多个视频的频道存在问题。