curl/wget/file_get_contents获取JPG无效,浏览器正常,如何解决?
解决通过curl、wget或file_get_contents获取Homeaway图片的问题
我碰到过不少这类酒店房源图片的反爬情况,核心原因就是Homeaway这类网站会检查请求的User-Agent头——如果检测到是非浏览器发起的请求,就会返回无效的图片数据或者直接拒绝访问。咱们只需要模拟浏览器的请求头就能轻松解决,下面分别给你三种工具的具体解决方案:
方法一:使用curl获取
不管是命令行还是PHP代码,都需要添加浏览器的User-Agent头来模拟正常请求:
命令行版本
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" -o image.jpg https://odis.homeaway.com/odis/listing/5895882c-6c65-47f5-b782-e13b8246e4aa.c10.jpg
PHP代码版本
$imageUrl = 'https://odis.homeaway.com/odis/listing/5895882c-6c65-47f5-b782-e13b8246e4aa.c10.jpg'; $ch = curl_init($imageUrl); // 设置模拟浏览器的User-Agent curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 处理可能的重定向 $imageData = curl_exec($ch); curl_close($ch); if ($imageData !== false) { // 保存图片到本地 file_put_contents('image.jpg', $imageData); // 尝试创建图像资源 $image = imagecreatefromstring($imageData); if ($image !== false) { echo '图片处理成功'; imagedestroy($image); } else { echo '无法解析图片数据'; } } else { echo '获取图片失败'; }
方法二:使用file_get_contents获取
file_get_contents默认的请求头没有浏览器标识,咱们需要创建一个包含User-Agent的上下文:
$imageUrl = 'https://odis.homeaway.com/odis/listing/5895882c-6c65-47f5-b782-e13b8246e4aa.c10.jpg'; $context = stream_context_create([ 'http' => [ 'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36\r\n" ] ]); $imageData = file_get_contents($imageUrl, false, $context); if ($imageData !== false) { file_put_contents('image.jpg', $imageData); $image = imagecreatefromstring($imageData); if ($image !== false) { echo '图片保存并解析成功'; imagedestroy($image); } else { echo '图片数据无效'; } } else { echo '获取图片失败'; }
方法三:使用wget(增强兼容性)
虽然你说wget已经能拿到图片,但有时候网站可能会调整策略,显式指定User-Agent能确保万无一失:
wget --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" https://odis.homeaway.com/odis/listing/5895882c-6c65-47f5-b782-e13b8246e4aa.c10.jpg
补充说明
- 这里用的Chrome浏览器的
User-Agent,你也可以换成Firefox或者其他主流浏览器的标识 - 加上
CURLOPT_FOLLOWLOCATION是为了处理图片链接可能存在的重定向,确保拿到真实的图片数据 imagecreatefromstring比imagecreatefromjpeg更通用,能处理各种格式的图片数据
内容的提问来源于stack exchange,提问作者Aakash John
相关产品推荐
相关产品推荐

