如何使用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()
)(如果不是这种情况,你可能会摆弄urlread
的CharSet
选项。)
如果你不能通过摆弄编码和强制转换从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中直接对HttpAgent
和java.io
类进行编码。