PHP使用file_get_contents请求Qwant图片API报错,求错误原因
问题分析与解决方案
这个错误本质上是你的请求没被Qwant API正确处理,服务器返回了HTML错误页面而非预期的JSON数据,具体原因和解决办法如下:
核心原因
- URL参数格式错误:你写的URL里用了
&(HTML转义后的&),但在PHP代码里直接用这个转义字符会导致URL解析出错,服务器没法正确识别count、offset这些参数,因此返回错误页面。 - 缺少必要请求头:Qwant的API大概率会验证请求的
User-Agent信息,而file_get_contents默认发送的请求头没有符合要求的User-Agent,被服务器判定为非浏览器请求(比如爬虫),从而拒绝返回JSON数据,转而返回HTML页面。
修正后的代码示例
<?php // 修正URL:把&换成原始的& $newURL = 'https://api.qwant.com/api/search/images?count=10&offset=1&q=Spicy Cranberry Cavolo Nero (Kale)'; // 构造包含浏览器标识的请求上下文 $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" ] ]); // 使用带上下文的请求获取数据 $returnedData = file_get_contents($newURL, false, $context); // 添加错误检查逻辑 if ($returnedData === false) { $error = error_get_last(); echo "请求失败:" . $error['message']; } else { // 解析并输出JSON数据 $data = json_decode($returnedData, true); var_dump($data); } ?>
额外说明
- 替换
&为&后,URL的参数才能被服务器正确解析; - 添加符合浏览器标准的
User-Agent头,模拟正常的浏览器请求,避免被API的反爬机制拦截; - 建议保留错误处理逻辑(比如示例中的
error_get_last),方便后续排查其他潜在问题。
内容的提问来源于stack exchange,提问作者user1493588




