
大数据时代,如何搜集有效数据
小编从阿尔兹海默症成病机理出发,提到了如何对模型参数降维的问题。我们先来复(Yù)习(Xí)一下那张图表:
经过复(Yù)习(Xí)后,这张图似乎不再那么催人入眠了!不仅如此,而且我们可以使用信息几何,这一自内而外散发着高格调的技术,达到参数降维的目的。正所谓——
一声惊雷划冬去,两鸣鸿雁游春来。
三月桃花映山红,四处玉兰拟雪白。
五味醇酿温心海,六色晨光覆阴霾。
七刻余晖寓暖阳,八方云动照英才。
冬去春来,良辰美景,更何况突然有了解决难题的思路,心情大好,正该不醉不归!但回头仔细一想,读者们会发现还有另一个大问题——数据从什么地方得来呢?巧妇难为无米之炊,就算理论算法再高屋建瓴天花乱坠,若没有实验数据的支持,那也无异于纸上谈兵。大数据时代,信息(数据)的搜集可是极其重要的。信息(数据)通常来源于网络,而如何过滤掉无用的数据,提取有效成分,这也是公认的难题。下图是一个例子:
提取有效信息的过程
因此提取有效数据的关键在于准确地抓住信息的特点,或者关键词(keywords)。当我们把关键词输入到搜索引擎(百度、谷歌等)后,这些搜索引擎就会以一定的优先级返回我们想要的信息。那么搜索引擎是怎么展开搜索的呢?答案:网络爬虫或者网络蜘蛛(web crawler或web spider,以下简称爬虫)。
一、网页的本质
网是静态的,但爬虫是动态的,所以爬虫的基本思想就是沿着网页(蜘蛛网的节点)上的链接的爬取有效信息。当然网页也有动态(一般用PHP或ASP等写成,例如用户登陆界面就是动态网页)的,但如果一张蛛网摇摇欲坠,蜘蛛会感到不那么安稳,所以动态网页的优先级一般会被搜索引擎排在静态网页的后面。
知道了爬虫的基本思想,那么具体如何操作呢?这得从网页的基本概念说起(本文只讨论静态网页)。一个网页有三大构成要素,分别是html文件、css文件和JavaScript文件。如果把一个网页看做一栋房子,那么html相当于房子外壳;css相当于地砖涂料,美化房子外观内饰;JavaScript则相当于家具电器浴池等,增加房子的功能。从上述比喻可以看出,html才是网页的根本,毕竟地砖颜料在市场上也有,家具电器都可以露天摆设,而房子外壳才是独一无二的。
下面就是一个简单网页的例子:
而在爬虫眼里,这个网页是这样的:
因此网页实质上就是超文本(hypertext),网页上的所有内容都是在形如“<>...</>”这样的标签之内的。如果我们要搜集网页上的所有超链接,只需寻找所有标签中前面是"href="的字符串,并查看提取出来的字符串是否以"http"(超文本转换协议,https表示安全的http协议)开头即可。如果超链接不以"http"开头,那么该链接很可能是网页所在的本地文件或者ftp或smtp(文件或邮件转换协议),应该过滤掉。
二、爬虫实例
既然知道了网页的本质,相信读者们已经跃跃欲试了。为了使读者更好地理解爬虫的工作原理,小编将用两种方式编写一个最简单的爬虫,用以获取谷歌首页上的所有超链接(以http://或https://开头,过滤掉本地文件),并把它们存到电子表格(Excel)中。
从第一节的分析可以看出,超链接出现在标签"<a href="...">... </a>"中,所以我们只需要匹配关键词"href="即可。考虑到python是最简单且使用最广泛的多用途语言,小编以python 3.6版本为例写了如下爬虫,详细注解都在图片中,有兴趣的读者可以亲自尝试,看看会出来什么结果:
如果采用过程式编写思路,代码还会更短一些。为图简单,小编没有使用异常处理手段(Exceptional Handling,一般指try-exception语句,或者条件语句加flag值),这种语句可以用于检查网络链接是否异常、搜集文件的过程是否成功甚至本地文件读写是否正常等。这种手段常常被经常做计算机模拟的科研工作者忽视,以至于当小编把自己写的程序和一些教授讨论时,常常被评论说我的程序“很花哨,没必要写得像商业程序”。尽管这种手段并非必须,但经小编大量实践后发现,当编写的代码过长时,这种手段实则可以有效提高程序查错(debug)的效率。尤其是在计算机模拟中,程序中的bug经常来自于内存错误(数组长度溢出、指针错误等),若不采用异常处理手段,这种bug会非常棘手。就像恋爱中的少女一样,因内存错误造成的程序崩溃可以发生在任意时刻任意地点,全由计算机的心情而定。
或许不了解编程读者会表示异议:“这代码有足足32行,哪里简单了!”其实去掉空行和评论后也就21行,也不算太多。什么,还嫌多?好吧,为了造福更多读者,也为了让大家感受一下21世纪之前的程序员前辈们是如何码代码的,小编又用Unix的外壳脚本(shell script)把这个爬虫重新写了一遍,并命名为"crawler.sh"。同样,详细注释尽在图中(这是所有Unix系统都有的emacs文档编辑器):
从21行简化到只有8行!执行后,得到的电子表格内容是这样的:
如果经过了尝试和对比,读者可以发现使用外壳脚本比python多搜集了很多网址,而且还去掉了重复的链接。这是因为“wget”命令不仅搜集了谷歌主页面上的所有链接,而且直接把谷歌根目录里能访问到的文件全都爬了个遍。有了这一项技术,我们可以大大丰富电脑E盘中“三个代表重要思想”、“党章党规全集”和“日本现代史研究”等文档的内容,从而精神境界得到极大提高。
有经验的读者可能注意到了,小编明明用的是Windows系统的命令指示符(cmd),又没有安装虚拟机,怎么变成了Unix的外壳脚本呢?从历史角度来讲,Unix和Windows完全是两个不同派系,两者理应是互不兼容的。但事实上2015年自Win10发布以后,微软官方就宣布Win10可以很简易地安装苹果的终端(苹果OS系统是Unix系统的一个分支,具体方式见文献[2]),并通过“bash”命令实现从cmd到苹果终端的转变,从此告别了Unix虚拟机的时代!值得一提的是,vim文档编译器可以在Windows下直接使用;emacs由于功能较多,需要输入“sudo apt-get install emacs”命令来安装。
值得一提的是,因为习惯原因,很多人根深蒂固地认为Windows系统更适合家用,Unix系统才适合程序员。其实时代一直在变化,微软集团也在不断地对Windows系统进行改进,一方面更好地兼容Unix体系,另一方面则开发更为先进的外壳平台。例如Powershell就是一个很好的例子。小编试着用过Powershell,它的一些语句和Unix外壳脚本颇为类似,同时也支持对象的定义,而且还有和编程语言一样的高度可读性。只是对于习惯了Unix外壳的程序员而言,Powershell可能显得不那么熟悉。
回到爬虫的话题。经过两种方式的对比,我们可以发现外壳脚本的巨大优势——可以与计算机硬件直接交流,这就是为什么程序调试员往往对外壳脚本(或汇编语言)滚瓜烂熟的原因。当然作为多用途式的编程语言,python的其他优势也不是外壳脚本所具有的。在什么场合使用何种语言,这个判断十分重要。
三、守规矩的爬虫才是好爬虫
当一个爬虫活动过于频繁时,会造成网络交通堵塞,因此一些网站很反感陌生的爬虫。怎么样限制陌生爬虫的行为呢?答案就在目标网站根目录的"robot.txt"文件里面,这个文件规定了爬虫应该遵守的条款。当正常的爬虫开始爬取网页信息时,会首先检查robot.txt的规定并且遵守它。例如百度的robot.txt是这样的:
可见百度只允许少数几个搜索引擎访问,所以直接用第二节的方法爬取百度首页是会被拒绝的。如果确实有批量作业的必要,则应该把爬虫的“User-agent”改为上述任一浏览器的字符串,以模仿浏览器访问的过程,并且限定爬虫的活动频率。
有的坏爬虫(Bad bots)直接无视掉robot.txt里的约束,肆无忌惮地爬取网页信息,不仅可能造成网络瘫痪,还会出现安全隐患。如何过滤掉这些爬虫,是网络安全领域的一大课题,尤其是高级的爬虫会使用分布式技术(多个客户端分别爬取网页,用以防止IP被查封)和抓取AJAX(用以模仿JavaScript以爬取动态网页)等,这就使得反爬虫的工作变得十分具有挑战性。
有趣的是,几乎每个大型网站都会有对应的robot.txt,而这些文件能在一定程度上反映出不同网站开发者的偏好。有兴趣的读者可以自行分析。
四、完整的搜索引擎
搜索引擎要做的当然不止普通爬虫那么简单。读者可以思考一下,当你在百度上输入关键词“谢雕英雄传”时,搜索出的结果会是“射雕英雄传”,怎么做到的呢?显然还需要文字和网页的预处理(Preporcessing)。另一方面,能匹配关键词的网页太多了,总得有个先后次序吧。这就是网页的排序(Ranking)问题[3]。
预处理通常有三个步骤,第一是把网页中的文字编号(indexing),这样匹配关键词就变成了寻找编号的的问题;第二是关键词溯源(stemming),例如去掉“的”、“我”和标点符号等不重要符号限制;第三是提取网页中的关键信息。要记住,浏览器眼中的网页永远都是一堆代码,所以需要过滤掉标签符号、超链接和网页排版布局等冗杂信息。
网页排序的算法有很多,不同浏览器使用的算法也有不同,但核心都是一样的——把网络看作有向图(小编在《爱因斯坦vs阿尔法狗》[4]中提到过,这里又出现了)。网页是有向图的节点,如果网页A上有指向网页B的链接,那么就形成了一条节点A到节点B的箭头,有向图就这么被产生了。
可以看出,[4]中的神经网络其实只是网络的一个特例。如果一个网页(节点)的链接出现在其他很多网页上,说明这个网页很受欢迎,理应得到较高的排名。事实上我们可以把这一过程用马尔可夫链(Markov Chain)表示出来。以谷歌的PageRank算法为例[5]:
由马尔科夫链的遍历性定理可知,当矩阵A满足不可约和渐进无周期条件时(irreducible和aperiodic,也就是网络连通,且当经历的链接够多时两个网页的深度只相差1),以上关于向量P(把P看作向量,分量加起来为1)的方程一定存在稳定解。稳定解(或者收敛性)是计算工作者们的最爱,因为有了稳定解以后,就可以通过迭代算法把这个稳定解找出来,从而得到网页排序!
一帆风顺的事并没有那么多,因为用上面这一方法定义出来的A未必不可约。这就是为什么要额外加一项d,把右边这个矩阵活生生地变得不可约。这就是PageRank算法的精妙之处——看起来很简单,但简单的智慧往往可以创造出巨大的功效。这也是小编所希望追求的数学——简单,但普适性很高。
当然,这只是最原始的PageRank算法。由于不少网站利用这一算法的特点,来千方百计增加自己的排名(例如把字体和网页背景色设置为一样的颜色以欺骗搜索引擎),谷歌也不断在更新自己的算法,以达到精准和快速两大目的。两者之间的相互较量也构成了网络领域的另一个课题,即垃圾链接和垃圾邮件的清理。其中又有很多手段,在此不一一介绍了。
五、总结和其他
如果读者能够读懂整篇文章,那么恭喜,你已经大体掌握了网页的本质、简单爬虫的实现和搜索引擎的工作原理这三大互联网基础知识,可以准确地搜集自己想要的数据了。比起满目琳琅的数据处理和分析手段,数据的搜集方式简单粗暴,一学就会!
大数据时代,程序员可谓是十分吃香的行业,入门快且收入高,再多繁忙也可一笔勾销。但不同于传统学科,计算机语言的发展更新速度十分迅猛,同一种语言的不同版本都可能发生巨大的变化。例如小编在学习计算机系统的经典教材Computer Systems A programmer's Perspective(《深入理解计算机系统》)时,在线程控制(Thread Control)那一章花了不少时间,因为稍不注意就会发生内存崩溃。
相信通过这幅图能找到不少同道中人
后来发现了mpi和openmp这两个神奇的工具后,就再也没用过"Ptheread_join"(加入线程)和"Ptheread_exit"(退出线程)这些老掉牙的命令。和细胞生物学类似(在小编另一篇文章《护肤与保养》[6]中提到过),计算机语言也具有高度可变性,我们需要与时俱进,做好学习新知识的准备。
作为新时代的弄潮儿,生物和计算机领域的人才需求量是巨大的,这两个学科之间交相辉映相辅相成,颇有几分上个世纪数学和物理相互促进共同进步的味道。它们能给21世纪带来怎样的变革?我们在拭目以待的同时,也应当做好应对各种变化的准备。古诗云:
李杜诗篇万口传,至今已觉不新鲜。
江山代有才人出,各领风骚数百年。
古人尚有此等远见,更何况这个沐浴在大数据海洋中,充满了机遇与挑战的时代?
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
探秘 z-score:数据分析中的标准化利器 在数据的海洋中,面对形态各异、尺度不同的数据,如何找到一个通用的标准来衡量数据 ...
2025-06-26Excel 中为不同柱形设置独立背景(按数据分区)的方法详解 在数据分析与可视化呈现过程中,Excel 柱形图是展示数据的常用工 ...
2025-06-26CDA 数据分析师会被 AI 取代吗? 在当今数字化时代,数据的重要性日益凸显,数据分析师成为了众多企业不可或缺的角色 ...
2025-06-26CDA 数据分析师证书考取全攻略 在数字化浪潮汹涌的当下,数据已成为企业乃至整个社会发展的核心驱动力。数据分析师作 ...
2025-06-25人工智能在数据分析的应用场景 在数字化浪潮席卷全球的当下,数据以前所未有的速度增长,传统的数据分析方法逐渐难以满足海 ...
2025-06-25评估模型预测为正时的准确性 在机器学习与数据科学领域,模型预测的准确性是衡量其性能优劣的核心指标。尤其是当模型预测结 ...
2025-06-25CDA认证:数据时代的职业通行证 当海通证券的交易大厅里闪烁的屏幕实时跳动着市场数据,当苏州银行的数字金融部连夜部署新的风控 ...
2025-06-24金融行业的大数据变革:五大应用案例深度解析 在数字化浪潮中,金融行业正经历着深刻的变革,大数据技术的广泛应用 ...
2025-06-24Power Query 中实现移动加权平均的详细指南 在数据分析和处理中,移动加权平均是一种非常有用的计算方法,它能够根据不同数据 ...
2025-06-24数据驱动营销革命:解析数据分析在网络营销中的核心作用 在数字经济蓬勃发展的当下,网络营销已成为企业触达消费者 ...
2025-06-23随机森林模型与 OPLS-DA 的优缺点深度剖析 在数据分析与机器学习领域,随机森林模型与 OPLS-DA(正交偏最小二乘法判 ...
2025-06-23CDA 一级:开启数据分析师职业大门的钥匙 在数字化浪潮席卷全球的今天,数据已成为企业发展和决策的核心驱动力,数据分析师 ...
2025-06-23透视表内计算两个字段乘积的实用指南 在数据处理与分析的过程中,透视表凭借其强大的数据汇总和整理能力,成为了众多数据工 ...
2025-06-20CDA 一级考试备考时长全解析,助你高效备考 CDA(Certified Data Analyst)一级认证考试,作为数据分析师领域的重要资格认证, ...
2025-06-20统计学模型:解锁数据背后的规律与奥秘 在数据驱动决策的时代,统计学模型作为挖掘数据价值的核心工具,发挥着至关重要的作 ...
2025-06-20Logic 模型特征与选择应用:构建项目规划与评估的逻辑框架 在项目管理、政策制定以及社会服务等领域,Logic 模型(逻辑模型 ...
2025-06-19SPSS 中的 Mann-Kendall 检验:数据趋势与突变分析的利器 在数据分析的众多方法中,Mann-Kendall(MK)检验凭借其对数据分 ...
2025-06-19CDA 数据分析能力与 AI 的一体化发展关系:重塑数据驱动未来 在数字化浪潮奔涌的当下,数据已然成为企业乃至整个社会发展进 ...
2025-06-19CDA 干货分享:统计学的应用 在数据驱动业务发展的时代浪潮中,统计学作为数据分析的核心基石,发挥着无可替代的关键作用。 ...
2025-06-18CDA 精益业务数据分析:解锁企业增长新密码 在数字化浪潮席卷全球的当下,数据已然成为企业最具价值的资产之一。如何精准地 ...
2025-06-18