15

特定のチャンネルのすべてのビデオURLを取得したい。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
4

6 に答える 6

12

max-results を 1 から必要な数まで増やしますが、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
于 2013-03-19T23:16:55.643 に答える
6

ここや他の場所にあるコードに基づいて、これを行う小さなスクリプトを作成しました。私のスクリプトは Youtube の API の v3 を使用しており、Google が検索用に設定した 500 件の結果制限に違反していません。

コードは GitHub で入手できます: https://github.com/dsebastien/youtubeChannelVideosFinder

于 2014-06-16T04:57:20.930 に答える
5

簡潔な答え:

そんなときに役立つライブラリがあります。

pip install scrapetube

import scrapetube

videos = scrapetube.get_channel("UC9-y-6csu5WGm29I7JiwpnA")

for video in videos:
    print(video['videoId'])

長い答え:

上記のモジュールは、他のソリューションがないため、私が作成しました。これが私が試したことです:

  1. セレン。これは機能しましたが、3 つの大きな欠点がありました。 1. Web ブラウザーとドライバーをインストールする必要があります。2. 大きな CPU とメモリを必要とします。3. 大きなチャネルを処理できません。
  2. youtube-dl を使用します。このような:
import youtube_dl
    youtube_dl_options = {
        'skip_download': True,
        'ignoreerrors': True
    }
    with youtube_dl.YoutubeDL(youtube_dl_options) as ydl:
        videos = ydl.extract_info(f'https://www.youtube.com/channel/{channel_id}/videos')

これは小規模なチャンネルでも機能しますが、大規模なチャンネルでは、短時間に非常に多くのリクエストを行うため、YouTube によってブロックされます (youtube-dl は、チャンネル内のすべてのビデオについてより多くの情報をダウンロードするため)。

scrapetubeそこで、Web API を使用してすべての動画を取得するライブラリを作成しました。

于 2021-06-25T09:15:59.403 に答える
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 以上の動画を含むチャンネルでは、ブラウザーに新しい動画をロードするのに必要な時間が一貫しなくなるため、問題が発生していました。

于 2020-11-10T21:43:11.937 に答える