大数据时代,如何搜集有效数据
小编从阿尔兹海默症成病机理出发,提到了如何对模型参数降维的问题。我们先来复(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世纪带来怎样的变革?我们在拭目以待的同时,也应当做好应对各种变化的准备。古诗云:
李杜诗篇万口传,至今已觉不新鲜。
江山代有才人出,各领风骚数百年。
古人尚有此等远见,更何况这个沐浴在大数据海洋中,充满了机遇与挑战的时代?
数据分析咨询请扫描二维码
《Python数据分析极简入门》 第2节 4 Pandas条件查询 在pandas中,可以使用条件筛选来选择满足特定条件的数据 importpanda ...
2024-11-22数据分析师的工作内容涉及多个方面,主要包括数据的收集、整理、分析和可视化,以支持商业决策和问题解决。以下是数据分析师的一 ...
2024-11-21数据分析师必须掌握的技能可以从多个方面进行归纳和总结。以下是数据分析师需要具备的主要技能: 统计学基础:数据分析师需要 ...
2024-11-21数据分析入门的难易程度因人而异,总体来看,入门并不算特别困难,但需要一定的学习和实践积累。 入门难度:数据分析入门相对 ...
2024-11-21数据分析是一项通过收集、整理和解释数据来发现有用信息的过程,它在现代社会中具有广泛的应用和重要性。数据分析能够帮助人们更 ...
2024-11-21数据分析行业正在迅速发展,随着技术的不断进步和数据量的爆炸式增长,企业对数据分析人才的需求也与日俱增。本文将探讨数据分析 ...
2024-11-21数据分析的常用方法包括多种技术,每种方法都有其特定的应用场景和优势。以下是几种常见的数据分析方法: 对比分析法:通过比 ...
2024-11-21企业数字化转型是指企业利用数字技术对其业务进行改造和升级,以实现提高效率、降低成本、创新业务模式等目标的过程。这一过程不 ...
2024-11-21数据分析作为一个备受追捧的职业领域,吸引着越来越多的女性加入其中。对于女生而言,在选择成为一名数据分析师时,行业选择至关 ...
2024-11-21大数据技术专业主要学习计算机科学、数学、统计学和信息技术等领域的基础理论和技能,旨在培养具备大数据处理、分析和应用能力的 ...
2024-11-21《Python数据分析极简入门》 第2节 3 Pandas数据查看 这里我们创建一个DataFrame命名为df: importnumpyasnpi ...
2024-11-21越老越吃香的行业主要集中在需要长时间经验积累和专业知识的领域。这些行业通常知识更新换代较慢,因此随着年龄的增长,从业者能 ...
2024-11-20数据导入 使用pandas库的read_csv()函数读取CSV文件或使用read_excel()函数读取Excel文件。 支持处理不同格式数据,可指定分隔 ...
2024-11-20大数据与会计专业是一门结合了大数据分析技术和会计财务理论知识的新型复合型学科,旨在培养能够适应现代会计业务新特征的高层次 ...
2024-11-20要成为一名数据分析师,需要掌握一系列硬技能和软技能。以下是成为数据分析师所需的关键技能: 统计学基础 理解基本的统计概念 ...
2024-11-20是的,Python可以用于数据分析。Python在数据分析领域非常流行,因为它拥有丰富的库和工具,能够高效地处理从数据清洗到可视化的 ...
2024-11-20在这个数据驱动的时代,数据分析师的角色变得愈发不可或缺。他们承担着帮助企业从数据中提取有价值信息的责任,而这些信息可以大 ...
2024-11-20数据分析作为现代信息时代的支柱之一,已经成为各行业不可或缺的工具。无论是在商业、科研还是日常决策中,数据分析都扮演着至关 ...
2024-11-20数字化转型已成为当今商业世界的热点话题。它不仅代表着技术的提升,还涉及企业业务流程、组织结构和文化的深层次变革。理解数字 ...
2024-11-20在现代社会的快速变迁中,选择一个具有长期增长潜力的行业显得至关重要。了解未来发展前景好的行业不仅能帮助我们进行职业选择, ...
2024-11-20