使用 cURL 抓取 JSON 文本时无法解析?
Posted
技术标签:
【中文标题】使用 cURL 抓取 JSON 文本时无法解析?【英文标题】:JSON text unparseable when using cURL to grab it? 【发布时间】:2016-04-07 13:27:27 【问题描述】:我有这个非常长的 JSON 字符串:http://pastebin.com/2jJKSGHs,它是从音乐 API 中提取的。
我设置了这段代码来解析它(http://pastebin.com/EuJtuhHg):
$url = "https://api.discogs.com/database/search?type=artist&q=pink[keyandsecretredacted]";
//initialize the session
$ch = curl_init();
//Set the User-Agent Identifier
curl_setopt($ch, CURLOPT_USERAGENT, 'YourSite/0.1 +http://your-site-here.com');
//Set the URL of the page or file to download.
curl_setopt($ch, CURLOPT_URL, $url);
//Ask cURL to return the contents in a variable instead of simply echoing them
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//Execute the curl session
$output = curl_exec($ch);
//close the session
curl_close ($ch);
//decode and print output
$output = json_decode($output2, true);
echo($output['results'][0]['title']);
当我将 JSON 字符串的内容直接插入到我的代码中时,json_decode 可以完美地处理它。但是当我尝试使用上面的方法从 API 中获取它时,我的页面上什么也没有打印——它只是空的。打印出 json_last_error 返回“0”,所以它没有检测到任何错误。
任何想法为什么会发生这种情况?
【问题讨论】:
我将原始 pastebin 的内容复制到json
文件中,将其导入到变量中,使用 json_decode
,它运行良好。如果 json_decode
对您不起作用,您的代码中还有其他原因会导致错误。
你是对的。我应该在发布之前测试一下。当我将文本直接插入代码时效果很好。由于此文本来自 API,因此我使用 curl 来获取它(pastebin.com/EuJtuhHg)。 /然后/它不起作用。它实际上没有在页面上打印任何内容,当我运行 json_last_error() 它说没有错误。我认为撇号是由于不同的原因造成的,但现在我想知道它是否还有其他原因。
啊,我很高兴我回来看看你改变了你展示的东西。您的代码中没有真正的“错误”。你在$output2
上调用json_decode
,它什么都不包含,你想在$output
上调用它,它完美地工作^^
你可以var_export $output的$output = curl_exec($ch);
另外,要么删除这个问题,要么标记它,以便模组可以从帖子历史记录中删除你的 api 密钥和秘密。
【参考方案1】:
替换
$output = curl_exec($ch);
与
$output2 = curl_exec($ch);
否则$output2
未定义,json_decode
使用未定义变量:
$output = json_decode($output2, true);
【讨论】:
不,我针对他们的 API 运行了您的原始代码,并且运行良好。如果你尝试类似https://google.com
会发生什么?
@matthew 这不是 API,在我的家庭系统和服务器以及 phpFiddle 上完美运行。这是您在 XAMPP 中使用 curl
设置的 ^^
@matthew 试试https://google.com
。从我在这里和 cmets 看到的所有内容来看,我怀疑 curl 是如何处理您的 SSL 连接(或 PHP 本身)的。可能通过 https 使用 file_get_contents
进行测试,如果通过 curl 执行此操作不起作用并且如果这不起作用,但对于非 https
有效,请专门查看 SSL 连接。我在很多项目中都使用 OpenSSL,所以我必须做的可能是相同的要求,但我不确定。不过它会给你一个很好的方向。
仅出于调试目的,请尝试以下curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
(不建议在生产代码中使用!!)。如果它适用于该行,则意味着由于某种原因没有使用任何证书设置 Curl。我还建议打开所有错误报告,这样您就可以查看它是否报告了“SSL 证书问题”之类的内容
@matthew 是的,许多共享托管服务器将不允许您使用 file_get_contents
抓取网页(或者,在大多数情况下,任何 file
类命令) 以上是关于使用 cURL 抓取 JSON 文本时无法解析?的主要内容,如果未能解决你的问题,请参考以下文章
无法解析代理:POST(在运行 curl 脚本进行 watson 文档转换时)
快速解析时无法在json post请求参数中添加文本字段输入的文本
C# |从 URL 抓取 JSON 无法将字符串转换为 int