PHP替代urllib.request urlopen及视频下载异常问题求助
PHP实现需前置浏览器访问的视频下载方案
核心原因
服务器大概率会验证请求的会话Cookie、User-Agent,甚至依赖前端访问生成的临时验证参数。直接用curl请求时缺少这些验证信息,所以无法通过校验;而浏览器访问会自动处理Cookie存储、前端逻辑触发等流程,后续请求就能通过验证。
解决方案步骤
1. 模拟浏览器首次访问,获取并保存验证所需的Cookie
先用CURL发送一次模拟浏览器的请求,把服务器返回的Cookie保存到本地文件,这一步相当于模拟“在浏览器打开一次URL”的操作。
2. 携带保存的Cookie发起下载请求
用保存好的Cookie再次请求视频URL,此时就能通过服务器的验证,完成视频下载。
完整代码示例
<?php // 替换为你的目标视频URL $videoUrl = "https://example.com/target-video"; // 临时存储Cookie的文件路径(确保PHP有读写权限) $cookieFile = __DIR__ . '/temp_video_cookie.txt'; // 第一步:模拟浏览器访问,获取Cookie $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $videoUrl); // 模拟Chrome浏览器的User-Agent,避免被识别为爬虫 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); // 启用Cookie保存功能 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // 自动跟随重定向 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 不输出响应内容,仅获取Cookie curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求 curl_exec($ch); curl_close($ch); // 第二步:携带Cookie下载视频 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $videoUrl); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'); // 加载之前保存的Cookie curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 设置视频保存路径 $outputFile = __DIR__ . '/downloaded_video.mp4'; $fp = fopen($outputFile, 'wb'); curl_setopt($ch, CURLOPT_FILE, $fp); // 执行下载请求 curl_exec($ch); // 关闭资源 fclose($fp); curl_close($ch); // 可选:删除临时Cookie文件 unlink($cookieFile); echo "视频下载完成,保存路径:{$outputFile}"; ?>
额外注意事项
- 若服务器还校验
Referer头,可在两步请求中添加:curl_setopt($ch, CURLOPT_REFERER, $videoUrl); - 部分网站会校验更多请求头(如
Accept、Accept-Language),可补充完整的请求头数组:
curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1' ]);
- 如果视频真实地址是动态生成的(需浏览器解析页面后获取),可在第一步请求后,用
DOMDocument或正则表达式解析响应内容,提取真实视频URL再进行下载。
内容的提问来源于stack exchange,提问作者Ziscom 18
相关产品推荐
相关产品推荐

