如何使用Matlab从StackExchange API访问数据?
天真的
sitedata = urlread('http://api.stackoverflow.com/1.1/questions?tagged=matlab')
由于数据被压缩,失败。但是,当我将其写入文件(使用fprintf(fileID,'%s',sitedata)
)时,我得到一个无法解压缩的zip文件。
答案 0 :(得分:5)
请尝试urlwrite()
:
urlwrite('http://api.stackoverflow.com/1.1/questions?tagged=matlab',...
'tempfile.zip')
gunzip('tempfile.zip')
fid = fopen('tempfile');
str = textscan(fid,'%s',Delimiter','\n');
fclose(fid);
此代码段的更好版本将使用tempname
动态生成临时文件名。
答案 1 :(得分:2)
Matlab的urlread
假设您正在获取文本数据,而不是二进制文件。当urlread
将字符数据解码为Unicode值以粘贴在Matlab char
中时,或者当格式化输出fprintf
函数将它们写出来时,gzip二进制数据就会被破坏,将它们编码为UTF-8或您用于fileID
的任何默认字符编码并更改字节序列,或者两者都可以。
urlread
将默认使用ISO-8859-1编码,这意味着将使用相同的数值将字节转换为Unicode代码点 - 实际上只是扩展。因此,您可以通过执行sitebytes = uint8(sitedata)
来获取字节数据。 (这是常规的uint8()
转换,而不是typecast()
。)(如果不是这种情况,您可以使用urlread
的{{1}}选项。)< / p>
如果你无法通过编码和强制转换来从CharSet
获取正确的字节数,那么你可以下拉并对urlread
的{{1}}进行调用。并绕过字符集解码步骤,或摆弄其选项。请参阅HttpAgent
来源了解如何操作。
在内存中有正确的字节后,可以使用较低级别的urlread
函数将它们写入文件,这不会通过执行字符集编码来破坏它们。然后,您将拥有该网站原始响应的有效gzip文件。 (我认为如果你也直接在char字符串上使用urlread
它会起作用,但是恕我直言笨蛋。)
您还可以使用Java类将其解压缩到内存中,并保存到文件系统的行程。执行fwrite()
将它们作为Java友好的有符号字节,然后将其粘贴到fwrite(fileID, sitedata, 'uint8')
并通过jsitebytes = typecast(sitebytes 'int8')
读出。您需要构建一个小的Java帮助器类,因为Matlab不能像ByteArrayInputStream
想要的那样通过引用传递GZIPInputStream
缓冲区,但是如果你在内存中做很多事情,它可能是值得的。像这样沉思。
当处理Web服务或更高级的数据下载(例如需要会话或证书的站点)时,我经常会在Matlab中直接针对byte[]
和java.io
类进行编码和编码。