我如何使用Matlab中的StackExchange API



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

天真

sitedata = urlread('http://api.stackoverflow.com/1.1/questions?tagged=matlab')

失败,因为数据被压缩了。但是,当我将此写入file(使用fprintf(fileID,'%s',sitedata))时,我得到一个无法解压缩的zip-file。

试试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来动态地生成临时文件名。

Matlab的urlread假设您正在获得文本数据,而不是二进制。当urlread解码字符数据到Unicode值以坚持在Matlab char s时,或者当格式化输出fprintf函数将它们写出来时,将它们编码为UTF-8或您正在使用的fileID和更改字节序列的任何默认字符编码,或者两者兼而有。

IIRC, urlread将默认使用ISO-8859-1编码,这意味着字节将被转换为具有相同数值的Unicode码点-实际上只是扩大。因此,您可以通过执行sitebytes = uint8(sitedata)来获取字节数据。(这是一个常规的uint8()转换,而不是typecast())(如果不是这种情况,你可能会摆弄urlreadCharSet选项。)

如果你不能通过摆弄编码和强制转换从urlread中得到正确的字节,那么你可以下拉并对Java HttpAgent进行调用,就像urlread一样,绕过字符集解码步骤,或者摆弄它的选项。请参阅urlread源代码了解如何操作。

一旦在内存中有了正确的字节,就可以使用较低级别的fwrite()函数将它们写入文件,该函数不会通过进行字符集编码来混淆它们。然后,您将获得站点原始响应的有效gzip文件。(我认为它会工作,如果你也只是使用fwrite(fileID, sitedata, 'uint8')直接对字符串,但它是丑陋的IMHO。)

您还可以使用Java类在内存中解压缩它,从而省去了对文件系统的访问。执行jsitebytes = typecast(sitebytes 'int8')以获得java友好的带符号字节,然后将其插入ByteArrayInputStream并通过GZIPInputStream读出。您需要构建一个小的Java助手类,因为Matlab不像java.io那样通过引用传递byte[]缓冲区,但如果您做了大量像这样的内存修改,则可能值得。

当使用web服务或更花哨的数据下载(例如需要会话或证书的网站)时,我经常最终从Matlab中直接对HttpAgentjava.io类进行编码。

最新更新