18行Python代码获取友盟数据
使用过友盟做产品数据监测的同学都知道,如果监控的账号或产品、版本、渠道过多,那抄录数据的工作将变得生不如死。
那么我们来看看怎样使用Python+友盟API来自动化的实现数据获取吧。
Anacoda
首先,你需要一个友盟的OPEN API文档。
可以去友盟官网申请,填写相关信息,一般一两天工作人员就会将文档用邮件发送回来。
也可以去这里下载:
其次,你需要配置好Python。用到的安装包有:requests(负责处理请求、认证及返回结果)、pandas(处理数据并存储文档)
推荐安装Anacoda,它已经集成了众多的数据分析包(包括pandas),可以节省大量的安装和处理报错问题的时间(天朝的网络,你懂的;Windows的各种冲突,你也懂的)。这里使用的是Anacoda2.7.10版本。
安装好Anacoda后,打开Windows自带的CMD窗口,输入:pip install requests来安装requests。
等到提示成功后,就可以开始着手数据获取工作了。
数据获取:
先看代码
解释一下,第一行申明了编码形式utf-8,以免使用中文出错。
第8-10行,import了后面需要使用到的几个库。开头做了解释,就不多说了。
第12-13行,使用requests的get方法获取数据,并赋值给content括号内的参数第一个是友盟提供的相应数据地址URL,第二部分auth是授权代码(将内容替换成你自己的用户名和密码,上面是友盟的示例账号,已经不能使用了)。在代码编写环节,可以使用:print content.text查看数据结构,以便进行进一步处理。
因为友盟API文档已说明返回的数据是json格式,因此我们推荐将结果复制到 这个网站进行解析,可以很清晰的看到我们获取数据的结果(tips:如果是抓取网页数据或获得的是其他类型数据,可能就需要使用正则表达式或beautisoup之类的工具来获取想要的内容)。
我们看json.cn解析的结果:
清晰吧!
左侧是我们复制进去的数据,右侧是解析出的结果,减号可以点击折叠,这个功能在返回的数据层次特别多的时候非常有用。
那么,怎么用代码解析数据?可能很多人认为,既然数据结构这么好,直接存成文件,用excel分列——筛选——再处理,不就有结果了?
但是很抱歉,似乎并没有这样的方法。所以我们要做数据清洗的工作,把需要的数据提取出来。
观察json.cn解析出的数据结构:最外层是以中括号开始的表示是列表;内部有大括号包含的内容,可以理解为字典(基本可以这么理解,小括号是元组,中括号是列表,大括号是字典)。
列表和字典都可以被索引,但索引的方式不同,列表可以使用编号进行索引:
例如我们将上述内容赋值给x,那么就可以用索引x[0]获取第一个中括号内的所有内容,用x[1]获取第二个中括号内的所有内容。
获取的x[0]是中括号代表字典的内容,童谣可以被索引,但索引的方式是key-value对,也就是我们要写出相应的冒号前面的名称:
例如x[0][“name”],就可以取到“Android Demo App”这个值。
于是我们假设想得到appname和appkey两个内容(appname是方便我们统计使用,appkey是后续获取各种数据的基础)。
第14行,因为返回的content是一个response对象,需要用内置的json()函数做解析,形成字典,这一行就是解析的作用,结果就是形成我们复制到json.cn中的数据结果。形成的content_json就是可以被索引的对象了。
第15-17行,定义一个i,来进行循环获取数据,同时定义两个空列表来存储获取到的appname和appkey信息。
我们上面得到的content_json的列表和字典是可以计算长度的,例如上述例子中,len(content_json)的结果就是2,表示该列表有两个元素。
第18-23行:所以循环体中,我们可以依据上面获得的长度来遍历。因为Python的索引是从0开始的,只需要遍历到小于2就可以了。中间的key=content_json[i][“appkey”]就表示获取列表中第i个位置里面字典的appkey对应的值。然后通过append方法将获取到的东西追加到前面定义的空列表中。
第24行,将获取到的两个列表合并,方便后面形成文件查看。
第25-26行,用pandas处理数据,并导出成txt文件。第25行中的index可以不加,但最后的结果就会没有列名称。第26行,对第25行的数据转置,并用to_csv方法存储文件。其中的encoding是对中文进行编码,除了“gb2312”,还可以尝试使用“gbk”,“utf-8”,这取决于获取数据的网页的编码形式;这里的index表示行名称,没有意义,所以写成false,否则默认会生成1,2,3……的编号。当然,这里的文件后缀名也可以写成csv,但貌似有时候会出错,所以建议还是用txt吧。
最终的结果就是这样的:
然后复制或者导入到Excel进行处理就非常方便了。
整个过程就完成了。作为一个初学者,在实现这个功能之前主要遇到两个瓶颈。
第一个:怎么从网上返回内容,于是看了很多通过httplib2等获取数据的资料,最后发现requests挺好用。
第二个:是返回的数据结果怎么存储为自己想要的文件,这个解析的过程,开始想的是整个存下来再处理;后来发现,应该用程序内部的逻辑来解决这个问题。 返回搜狐,查看更多
责任编辑: