京公网安备 11010802034615号
经营许可证编号:京B2-20210330
大数据时代,如何搜集有效数据
小编从阿尔兹海默症成病机理出发,提到了如何对模型参数降维的问题。我们先来复(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
在Python数据分析中,Pandas库的DataFrame是最核心、最常用的结构化数据表对象,类似于Excel的二维表格,具备规整的行列结构、字 ...
2026-09-07在数据分析、经营复盘、业绩预测与经济统计工作中,平均增速(平均增长率)是衡量数据长期变化趋势、业务发展快慢的核心指标。不 ...
2026-09-07 很多数据分析师精通Excel单元格操作,但当被问到“表结构数据的基本处理单位是什么”“字段和记录的本质区别”“为什么表结 ...
2026-09-07随着大数据技术的快速发展,商业竞争逐步从传统的经验式经营转变为数据驱动的精细化运营。海量的用户行为数据、交易数据、运营数 ...
2026-09-04CDA数据分析师 出品 作者:李诗怡 1. 波士顿矩阵(BCG Matrix) 定义: BCG于1970年提出的业务组合分析工具,以"市场增长率"(纵 ...
2026-09-04 数据分析师八成以上的时间在和数据表格打交道,但许多人拿到Excel后习惯性地先算、先分析,结果回头发现漏了一列关键数据, ...
2026-09-04数据透视表是Excel与Power BI中最核心的数据分析工具,具备快速汇总、维度拆分、动态筛选的能力,可高效完成数据归类与统计展示 ...
2026-09-03在Power BI数据分析可视化场景中,堆积柱状图+折线图是最常用的复合图表组合。堆积柱状图适合展示各细分维度当期数值、结构占比 ...
2026-09-03 很多数据分析师每天与Excel打交道,但当被问到“表格结构数据的基本处理单位是什么”“数据类型误判会引发哪些分析错误”“ ...
2026-09-03CDA数据分析师 出品 作者:李诗怡 一、8个核心数据清洗函数 1. TRIM:一键清除多余空格(最常用) 作用:仅保留文本中"单词/字 ...
2026-09-02数据分析的核心并非单纯操作工具、整理报表或绘制图表,而是依靠科学的思维逻辑挖掘数据价值、解释业务现象、指导经营决策。在完 ...
2026-09-02在社会经济、产业研究、区域治理与大数据实证分析中,面板数据是最具研究价值的数据类型。面板数据同时包含截面维度与时间维度信 ...
2026-09-02 很多数据分析师能熟练计算均值、标准差,但当被问到“如何用一张图让业务方3秒内看懂核心结论”“面对不同数据类型该怎么选 ...
2026-09-02在数据驱动决策的体系中,数据分析按照分析目的可分为描述性分析、诊断性分析、预测性分析与指导性分析四大类型。其中,诊断性分 ...
2026-09-01网络请求是Python爬虫开发、接口测试、数据拉取的核心基础功能,Python生态中主要依靠 urllib 和 requests 两大库实现HTTP请求操 ...
2026-09-01 很多数据分析师面对业务问题时,常常感到“知道要分析,却不知道用什么方法”。其实,数据分析并非无章可循——从三大基础范 ...
2026-09-01在数据库设计与业务数据维护中,自增ID是数据表最常用的主键字段,用于唯一标识每一条业务数据,正常状态下ID应保持连续递增。但 ...
2026-08-31在数理统计、数据分析、经济测算与日常量化评估中,平均值是刻画数据集中趋势、反映整体水平的基础核心指标。在实际应用中,最常 ...
2026-08-31在数据驱动的时代,数据分析早已不是“凭经验、靠感觉”的零散操作,而是一套具备固定逻辑、标准化流程的系统方法——这就是数据 ...
2026-08-31在大数据时代背景下,海量行业数据亟需通过专业化工具挖掘潜在价值,辅助企业业务决策、优化运营模式、规避经营风险。Python凭借 ...
2026-08-28