如何使用Matlab的StackExchange API?

时间:2013-01-09 23:34:30

标签: matlab stackexchange-api

如何使用Matlab从StackExchange API访问数据?

天真的

sitedata = urlread('http://api.stackoverflow.com/1.1/questions?tagged=matlab')
由于数据被压缩,

失败。但是,当我将其写入文件(使用fprintf(fileID,'%s',sitedata))时,我得到一个无法解压缩的zip文件。

2 个答案:

答案 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的任何默认字符编码并更改字节序列,或者两者都可以。

IIRC,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类进行编码和编码。