【问题标题】:Get all videos from YouTube channel page by page逐页获取 YouTube 频道中的所有视频
【发布时间】:2015-06-04 00:25:29
【问题描述】:

我需要从 YouTube 频道逐页获取所有视频。 YouTube API 允许一个人最多获得 50 个视频。 现在,我只得到 25 个视频并在页面中打印,使用 Django 分页。如何在页面上打印 YouTube 上的所有视频?

views.py 用于视频视图:

YOUTUBE_VIDEO_URL = "https://gdata.youtube.com/feeds/api/videos?author=*****&orderby=updated&v=2&alt=jsonc"

class VideoListView(ListView):
    template_name = "video/list.html"
    context_object_name = 'videos'
    paginate_by = 12
    def get_queryset(self, **kwargs):
        request = requests.get(settings.YOUTUBE_VIDEO_URL)
        data_about = simplejson.loads(request.text)
        video_list = []
        for item in data_about['data']['items']:
            video_list.append(item)
        return video_list

查看:

    <div id="list_articles">
                {% if videos %}
                    {% for video in videos %}
                        <div class="article">
                            <iframe src="http://www.youtube.com/embed/{{ video.id }}"
                                    width="300" height="225" frameborder="0" allowfullscreen></iframe>
                            <h2><a class="popup-youtube"
                                   href="http://www.youtube.com/watch?v={{ video.id }}">{{ video.title }}</a></h2>
                        </div>
                    {% endfor %}
                {% else %}
                    <div class="article">
                        <p>Nothing</p>
                    </div>
                {% endif %}
            </div>
{% if is_paginated %}
        <div id="pages">
            <p> Pages:{% for num in page_obj.paginator.page_range %}
                {% ifequal num page_obj.number %}
                    <span class="current"><b>{{ num }}</b></span>
                {% else %}
                    <a href="?page={{ num }}"> {{ num }}</a>
                {% endifequal %}
            {% endfor %}

            </p>

我想手动获取视频数量并将其按页数划分,但我不知道如何实现它

【问题讨论】:

    标签: python django api youtube


    【解决方案1】:

    好的,第一部分:获取视频(您需要一个 api-key,可能需要多个用于常规使用):

    这是 python 但你可以将它转换成你喜欢的任何东西,只要它可以发送 GET 请求:

    注意:CC 定义是否查找创作共用视频 您还可以使用搜索查找视频

    from requests import get
    from random import choice
    
    useSearch = True
    
    fname = "output"
    
    if useSearch :
        cc = False
        searchTerm = ""
        apiKeys = []
        apiKey = choice(apiKeys)
        url = "https://www.googleapis.com/youtube/v3/search"
        token = ""
        rDone = 0
        videos = []
        searching = True
        if cc :
            searchTerm = searchTerm + "&videoLicense=creativeCommon&type=video"
        while searching :
            print(url + "?key=" + apiKey + "&q=" + searchTerm + "&part=id&maxResults=50&pageToken=" + token)
            y = get(url + "?key=" + apiKey + "&q=" + searchTerm + "&part=id&maxResults=50&pageToken=" + token).json()
            if y['kind'] == "youtube#searchListResponse" :
                for x in y['items'] :
                    if x['id']['kind'] == "youtube#video" :
                        videos.append(x['id']['videoId'])
            rDone = rDone + int(y['pageInfo']['resultsPerPage'])
            if int(y['pageInfo']['totalResults']) <= rDone :
                searching = False
            elif int(y['pageInfo']['resultsPerPage']) > int(y['pageInfo']['totalResults']) :
                searching = False
            else :
                try :
                    token = y['nextPageToken']
                except :
                    searching = False
    else :
        cc = False
        channelID = ""
        apiKeys = ["AIzaSyBTV_7FVKuJBvFEPo1ZkLtXSl7w2Ulg6XY", "AIzaSyAzwkMIvLFYTYz5uHv-Idmq68Er_DzOEkI", "AIzaSyDPGSYUScf6j9A7uE1pWaXxK9j9TCGZbEs"]
        apiKey = choice(apiKeys)
        url = "https://www.googleapis.com/youtube/v3/search"
        token = ""
        rDone = 0
        videos = []
        searching = True
        if cc :
            channelID = channelID + "&videoLicense=creativeCommon&type=video"
        while searching :
            print(url + "?key=" + apiKey + "&channelId=" + channelID + "&part=id&order=date&maxResults=50&pageToken=" + token)
            y = get(url + "?key=" + apiKey + "&channelId=" + channelID + "&part=id&order=date&maxResults=50&pageToken=" + token).json()
            if y['kind'] == "youtube#searchListResponse" :
                for x in y['items'] :
                    if x['id']['kind'] == "youtube#video" :
                        videos.append(x['id']['videoId'])
            rDone = rDone + int(y['pageInfo']['resultsPerPage'])
            if int(y['pageInfo']['totalResults']) <= rDone :
                searching = False
            elif int(y['pageInfo']['resultsPerPage']) > int(y['pageInfo']['totalResults']) :
                searching = False
            else :
                try :
                    token = y['nextPageToken']
                except :
                    searching = False
    file = open(fname + ".txt", "w+")
    for index in range(len(videos)) :
        video = videos[index]
        if len(videos) - 1 == index :
            file.write(video)
        else :
            file.write(video + "\n")
    file.close()
    

    接下来,您需要将输出分成列表。使用这样的东西:

    ls = open("../output.txt", "r").read().split("\n")
    def chunks(lst, n):
        """Yield successive n-sized chunks from lst."""
        for i in range(0, len(lst), n):
            yield lst[i:i + n]
    pages = list(chunks(ls, 10))
    

    Pages[0] 将是第一页

    如果你想将它用于网页,你可以把它变成一个对 php 友好的东西并使用它

    【讨论】:

      猜你喜欢
      • 2015-09-02
      • 2016-05-13
      • 2021-03-14
      • 2017-11-21
      • 1970-01-01
      • 2015-07-16
      • 2013-03-08
      • 2014-10-29
      • 2016-03-01
      相关资源
      最近更新 更多