如何使用python检查youtube视频是否存在?

问题描述 投票:0回答:4

我有一个简单的函数,可以检查网站是否存在:

def try_site(url):
    request = requests.get(url)
    return request.status_code == 200

问题是,对于没有视频的 YouTube 网址,仍然存在一个页面 - 它不会返回 404 或类似的内容。所以我的代码显然认为该页面存在。我该如何检查视频是否存在?

python python-3.x python-requests youtube
4个回答
4
投票
import requests

pattern = '"playabilityStatus":{"status":"ERROR","reason":"Video unavailable"'


def try_site(url):
    request = requests.get(url)
    return False if pattern in request.text else True


print(try_site("https://youtu.be/dQw4w9WgXcQ"))
print(try_site("https://youtu.be/dQw4w9WgXcR"))

2
投票

抓取网页,检查页面中是否有“视频不可用”之类的文字。


1
投票

你能做的最简单的事情(至少适用于 youtube):

编辑:这更多的是检查特定的url是否可以直接成功访问

def try_site(url):
    request = requests.get(url, allow_redirects=False)
    return request.status_code == 200

禁止重定向并特别检查状态代码 200,有一个小问题,例如状态代码 302(在 YouTube 网址无效的情况下返回)意味着重定向到标头中提到的其他网址,简而言之这意味着您正在搜索的特定网址无法直接访问,那里没有内容,但这并不意味着特定内容不存在,它可能已移动到服务器上的其他位置(可能在标题中提到)(如果是 YouTube 可能不会)


0
投票

我写了一个简单的函数,大多数时候可能对你有帮助。它基于这样的假设:现有视频的 YouTube 页面将在 HTML 页面的标题标签中包含视频的标题。这是 Python 函数:

import requests
import validators
from bs4 import BeautifulSoup

def is_valid_youtube_video(url: str) -> bool:
    """
    Checks if a given URL is a valid YouTube video.

    Parameters
    ----------
    url : str
        The URL to check.

    Returns
    -------
    bool
        True if the URL is a valid YouTube video, False otherwise.

    Logic
    -----
    1. Check if the URL is valid.
    2. Check if the URL is a YouTube video.
    3. Check if the video exists.
    """

    # first check if the url is valid
    if not validators.url(url):
        print("Invalid URL")
        return False

    # then check if the url is a youtube video
    ## starting with https://www.youtube.com/watch?v=
    if not url.startswith("https://www.youtube.com/watch?v="):
        print("Not a YouTube video URL")
        return False

    # then check if the video exists
    response = requests.get(url)
    parsed_response = BeautifulSoup(response.text, "html.parser")

    ## method A: extract the title of the video
    pattern = re.compile(r'(.*?) - YouTube')
    title_text = pattern.match(parsed_response.title.string).group(1)

    ### if its empty (or no characters), then the video does not exist
    if not title_text.strip():
        print("(It is very likely that) the video does not exist")
        return False

    ## method B: TODO: look for a specific tag that indicates the video does not exist

    return True
© www.soinside.com 2019 - 2024. All rights reserved.