美文网首页程序员
“收割”数据的4种方法

“收割”数据的4种方法

作者: 紫松 | 来源:发表于2014-01-22 14:38 被阅读2315次

“兵马未动,粮草先行”,我们进行数据分析前,先行的粮草就是数据。通常我们想用数据验证自己生活中的各种想法时,并没有人为我们备好“粮草”,这就需要我们亲自下田收割。下面就讲讲我自己常备的4种收割工具。

1.通过写爬虫程序来爬取数据。

这种方法是最能灵活地获取数据的方法了。
不管是想爬取规范表格中的数据,还是不规范的分散数据(如下右图的每条的title,score,user等)


Image TitleImage Title

不管是想只爬取一个网页中的列表数据,还是多个网页的相同格式数据(如下右图不同网页中的‘译者’,‘浏览量’,‘评论数’数据)


Image TitleImage Title
甚至是每个记录有不定长字段数(如下,不同车次经过的车站列表)
Image TitleImage Title
成熟的爬虫框架对以上场景的处理都有不错的支持,能很方便地写出爬虫程序。普通的爬虫程序对编码能力要求较低,更像是个体力活,有编码背景的人都可以尝试此种方法,容易以不变应万变,是个长久之计。推荐一个Python的爬虫框架scrapy,简单好用,而且文档很完善。如果真的想学习爬虫,直接去看文档示例就是最佳选择。

2.通过在chrome的console来执行js代码直接获取数据。

在我获取数据的经历中,我也发现了一些网站在浏览器加载时,会将其数据加载到js变量中。遇到这种情况,就非常幸福了,因为保存数据的js变量多为一维数据和二维数组,格式规范,基本就是我们需要的纯数据,我们所需要的就是将这些js变量按照我们想要的格式打印出来,然后复制粘贴到我们的文本文件里。这里需要我们能读网站的js代码,以便能发现是否存在那样的数据变量,还需要能写简单的js代码,以便能将数据合理地打印出来,被excel等软件正确读取。在《体彩历险记》中所使用的nba赛程数据,就是采用的这种方法获取的。下面给出获取球队最近战况(只统计连胜场数,或连败场数)的数据示例:

Image TitleImage Title
在上图中的js代码里,e_rank,w_rank变量保存的就是东部和西部球队的战况数据,我只不过用latest()函数将打印过程封装了一下,arr[i][1]arr[i][16]分别是‘球队名称’和‘连续’变量,我只打印了我需要的这两个字段。

3.使用chrome的console自带的xpath解析功能,自己构造js数据变量。

上面的方法虽好,但是并非总能碰到那样的“幸福网站”。如果我们能自己构造js数据变量,再打印出来,那就真的多了一项通吃的技能了。XPath是一门在XML(XHTML基于XML)文档中查找信息的语言,能很方便灵活地从网页上解析出你想要的纯数据,其实scrapy爬虫框架内部对网页的解析也是基于xpath语言的。幸运的是,你并不需要对xpath了解很多,就可以使用chrome控制台自带的xpath解析功能轻而易举地将某个字段的全部值保存到js的数组里。所以这种方法的思路很简单,按照我下面的示例操作构建几个你需要的js数组变量,然后合理地打印出来即可。我们以数据排列相对不是那么规范的“startup news”为例,来描述此方法步骤。
首先,我来确定title的xpath,将鼠标放置于其中的一个title(例子中选择的是“Python设计模式在线实例”),然后右键,点击“审查元素”,接着会发现下方的开发者工具的Elements栏定位到了“Python设计模式在线实例”,然后对其鼠标右键,选择“copy XPath”即复制了此title的XPath,如下图。

Image TitleImage Title
上述title的Xpath为/html/body/center/table/tbody/tr[3]/td/table/tbody/tr[1]/td[3]/a,我们如下图对xpath稍作修改,即可得到当前网页的title列表,并存于js数据变量,同理,我们可以得到score列表等等,当然它们长度都是一致的,接下来则是将其打印输出的功夫。
Image TitleImage Title

4.直接在网页上复制粘贴数据,再使用文本编辑器修整数据。

当网页是数据表格时,如果又只是需要获取这一个网页的数据,为什么不选用高效率的“笨方法”呢?我真心想说一声:笨方法为工作效率带来改变。这里的笨方法就是直接在网页上复制粘贴数据,再结合正则表达式使用文本编辑器修整数据。以NBA赛程数据为例:
直接在网页复制表格数据


Image TitleImage Title

粘贴在文本编辑器中(这里使用的是sublime text),我们发现“2014年XX月...”,“比赛时间...”,还有每行结尾多出的制表符'\t',这些都是需要删除的。


Image TitleImage Title
我这里作示例,只复制了30多行,其实这个网页有200多行,为了快速处理这种删除问题,就需要结合简单的正则表达式进行文本替换。下图将文本中“2014年XX月...”类的行一起删除。
Image TitleImage Title
下图将文本中“比赛时间...”类的行一起删除。
Image TitleImage Title

下图将文本中每行结尾多出的制表符'\t'一起删除。最后就得到了满足格式的文本数据了。


Image TitleImage Title
最后这种方法对于编程几乎没有要求,学习一下基本的正则表达式即可。正则表达式如瑞士军刀一般,使用好了,没有修剪不整齐的数据。

总结

如果说爬虫程序是收割机的话,那么第4种方法只能算镰刀了,收割机虽好,但得会开才行,且还需加油维修,好不费力;镰刀虽钝,但面对一亩七分田,也能松松解决战斗。很多时候,最快捷的方法就是最后的那种笨方法,如果连正则表达式也懒得学,直接一行行手动删除也行,因为我们最关心就是能快点获取数据,以便进行更为重要的一步——分析。

相关文章

网友评论

    本文标题:“收割”数据的4种方法

    本文链接:https://www.haomeiwen.com/subject/xrbctttx.html