PHP无法抓取指定站点图片但Python可正常下载,如何通过PHP实现下载?
PHP下载指定站点图片失败的解决方案
核心原因
目标站点开启了反爬虫校验,会拦截不符合规则的请求:Python的请求库默认携带了合法的客户端标识,你当前编写的PHP curl请求未配置对应的请求头参数,被站点识别为爬虫请求因此拦截,无法获取资源。
修复后可用代码
<?php function downloadImage($img_url){ // 图片保存路径 $img_save_path = realpath(dirname(__FILE__)) . '/assets/upload_products/'; // 目录不存在则自动创建 if (!is_dir($img_save_path)) { mkdir($img_save_path, 0755, true); } $image_name = basename($img_url); $image_fullpath = $img_save_path . $image_name; $ch = curl_init($img_url); // 模拟Chrome浏览器UA,避免被识别为爬虫 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'); // 配置Referer为站点根域名,模拟从站点自身页面跳转访问 curl_setopt($ch, CURLOPT_REFERER, 'https://www.autoopt.ru/'); // 关闭SSL证书校验,避免HTTPS请求报错 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); $raw = curl_exec($ch); // 判断请求是否出错 if(curl_errno($ch)){ curl_close($ch); return false; } curl_close($ch); // 已存在则删除旧文件 if(file_exists($image_fullpath)){ unlink($image_fullpath); } $fp = fopen($image_fullpath, 'w'); fwrite($fp, $raw); fclose($fp); return true; } downloadImage('https://www.autoopt.ru/product_pictures/big/bcb/054511.jpg');
主要修改点
- 新增浏览器UA标识模拟:配置
CURLOPT_USERAGENT参数模拟正常Chrome浏览器请求 - 新增Referer请求头:配置
CURLOPT_REFERER参数符合站点的访问来源校验规则 - 新增HTTPS适配:关闭SSL证书校验,避免HTTPS请求因证书问题失败
- 新增异常判断逻辑:增加curl请求错误校验、目录存在性校验,避免目录不存在或无权限导致的写入失败
补充说明
如果修改后仍无法下载,可以抓包获取Python正常请求时的所有请求头,通过CURLOPT_HTTPHEADER参数把所有头信息配置到curl请求中,和Python的请求头完全保持一致即可正常获取资源。
内容的提问来源于stack exchange,提问作者AlwaysTheSame
相关产品推荐
相关产品推荐

