我有一个简单的函数,可以检查网站是否存在:
def try_site(url):
request = requests.get(url)
return request.status_code == 200
问题是,对于没有视频的 YouTube 网址,仍然存在一个页面 - 它不会返回 404 或类似的内容。所以我的代码显然认为该页面存在。我该如何检查视频是否存在?
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"))
抓取网页,检查页面中是否有“视频不可用”之类的文字。
你能做的最简单的事情(至少适用于 youtube):
编辑:这更多的是检查特定的url是否可以直接成功访问
def try_site(url):
request = requests.get(url, allow_redirects=False)
return request.status_code == 200
禁止重定向并特别检查状态代码 200,有一个小问题,例如状态代码 302(在 YouTube 网址无效的情况下返回)意味着重定向到标头中提到的其他网址,简而言之这意味着您正在搜索的特定网址无法直接访问,那里没有内容,但这并不意味着特定内容不存在,它可能已移动到服务器上的其他位置(可能在标题中提到)(如果是 YouTube 可能不会)
我写了一个简单的函数,大多数时候可能对你有帮助。它基于这样的假设:现有视频的 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