【问题标题】:How do I download videos from Pexels API?如何从 Pexels API 下载视频?
【发布时间】:2020-12-30 07:04:12
【问题描述】:

我有这段代码可以从 Pexels 中提取图像,但我不知道如何将其更改为视频。我以前从未见过任何人这样做,并且非常感谢任何帮助。我尝试将所有照片标签切换为视频,但这似乎不起作用。我也尝试添加更多库,但这似乎也不起作用。

import argparse
import json
import os
import time

import requests
import tqdm
from pexels_api import API

PEXELS_API_KEY = os.environ['PEXELS_KEY']
MAX_IMAGES_PER_QUERY = 100
RESULTS_PER_PAGE = 10
PAGE_LIMIT = MAX_IMAGES_PER_QUERY / RESULTS_PER_PAGE


def get_sleep(t):
    def sleep():
        time.sleep(t)
    return sleep


def main(args):
    sleep = get_sleep(args.sleep)

    api = API(PEXELS_API_KEY)
    query = args.query

    page = 1
    counter = 0

    photos_dict = {}

    # Step 1: Getting urls and meta information
    while page <= PAGE_LIMIT:
        api.search(query, page=page, results_per_page=RESULTS_PER_PAGE)
        photos = api.get_entries()

        for photo in tqdm.tqdm(photos):
            photos_dict[photo.id] = vars(photo)['_Photo__photo']
            counter += 1

        if not api.has_next_page:
            break

        page += 1
        sleep()

    print(f"Finishing at page: {page}")
    print(f"Images were processed: {counter}")

    # Step 2: Downloading
    if photos_dict:
        os.makedirs(args.path, exist_ok=True)

        # Saving dict
        with open(os.path.join(args.path, f'{query}.json'), 'w') as fout:
            json.dump(photos_dict, fout)

        for val in tqdm.tqdm(photos_dict.values()):
            url = val['src'][args.resolution]
            fname = os.path.basename(val['src']['original'])
            image_path = os.path.join(args.path, fname)

            if not os.path.isfile(image_path):  # ignore if already downloaded
                response = requests.get(url, stream=True)

                with open(image_path, 'wb') as outfile:
                    outfile.write(response.content)
            else:
                print(f"File exists: {image_path}")


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--query', type=str, required=True)
    parser.add_argument('--path', type=str, default='./results_pexels')
    parser.add_argument('--resolution', choices=['original', 'large2x', 'large',
                                                 'medium', 'small', 'portrait',
                                                 'landscape', 'tiny'], default='original')
    parser.add_argument('--sleep', type=float, default=0.1)
    args = parser.parse_args()
    main(args)

【问题讨论】:

  • 您找到解决方案了吗?

标签: python api web


【解决方案1】:

很抱歉碰到这个问题。在使用 python API pexelsPy 从 Pexels 下载视频时,我遇到了类似的情况。这可能会有所帮助:

我检索了视频的 ID,然后创建了具有以下结构的下载 URL:"https://www.pexels.com/video/"+ ID +"/download"

请看下面的例子:

def download_video(type_of_videos):

    video_tag = random.choice(type_of_videos)
    PEXELS_API = '-' #please add your API Key here
    api = API(PEXELS_API) 

    retrieved_videos = read_already_download_files('downloaded_files.txt')
    video_found_flag = True
    num_page = 1

    while video_found_flag:

        api.search_videos(video_tag, page=num_page, results_per_page=10)
        videos = api.get_videos()

        for data in videos:
            if data.width > data.height: #look for horizontal orientation videos
                if data.url not in retrieved_videos:
                    # write_file('downloaded_files.txt', data.url)
                    url_video = 'https://www.pexels.com/video/' + str(data.id) + '/download' #create the url with the video id
                    r = requests.get(url_video)
                    with open(data.url.split('/')[-2]+'.mp4', 'wb') as outfile:
                        outfile.write(r.content)
                    return data.url.split('/')[-2]+'.mp4' #download the video

        num_page += 1

download_video 函数接受一个带有多个标签的字符串数组,例如:['happy','sad','relax']。然后它随机选择这些标签之一。

PEXELS_API 应包含您的 API 密钥。

read_already_download_files('downloaded_files.txt'):检索已经下载的文件,检查当前找到的文件是否已经下载。

【讨论】:

  • 您好,欢迎来到 Stack Overflow!关于您的帖子如何回答问题,您能否更具体一点?
  • 您好,感谢您的欢迎。是的,当然。问:如何从 Pexels API 下载视频? A:我检索了视频的ID,然后创建了下载URL,其结构如下:“pexels.com/video/"+ID +”/download”,然后我只需请求创建的URL并保存文件,即下载的视频。问候。
  • @inou 如果您能够描述您的函数的工作原理及其依赖关系,这将对其他用户有所帮助。
【解决方案2】:
from pypexels import PyPexels
import requests
api_key = 'api id'
# instantiate PyPexels object
py_pexel = PyPexels(api_key=api_key)
search_videos_page = py_pexel.videos_search(query="love", per_page=40)
# while True:
for video in search_videos_page.entries:
    print(video.id, video.user.get('name'), video.url)
    data_url = 'https://www.pexels.com/video/' + str(video.id) + '/download'
    r = requests.get(data_url)
    print(r.headers.get('content-type'))
    with open('sample.mp4', 'wb') as outfile:
        outfile.write(r.content)
        # if not search_videos_page.has_next:
    break
        # search_videos_page = search_videos_page.get_next_page()

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 2013-09-10
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 2011-12-26
相关资源
最近更新 更多