京公网安备 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
在 MySQL 查询性能优化体系中,索引是降低查询耗时、提升数据库吞吐的核心手段。其中联合索引与覆盖索引是实际开发中最高频的两 ...
2026-06-15在数据仓库建设与商业智能分析体系中,维度建模是应用最广泛的建模方法论,而事实表与维度表是维度建模的两大核心构件,共同构成 ...
2026-06-15 很多数据分析师能熟练计算指标,但当被问到“这家企业的核心业务目标是什么”“如何把模糊的战略目标拆解为可量化的指标”“ ...
2026-06-15在数据分析、业务监控、运营复盘等场景中,列值趋势计算是核心需求之一。无论是分析销售额的月度增长、用户活跃的变化趋势、库存 ...
2026-06-12在数字经济深度渗透的当下,消费者的购买行为已从过去的 “被动接受” 转变为 “主动决策”。流量红利消退、获客成本攀升、用户 ...
2026-06-12CDA三级认证是三个级别中的塔尖,全面考察数据战略、团队领导和复杂项目的综合能力。它所对应的《敏捷数据挖掘》教材,不再局限 ...
2026-06-12在游戏产业的商业逻辑中,付费玩家是支撑游戏生存与发展的核心支柱。行业普遍遵循 “二八定律”:20% 的付费玩家贡献了游戏 80% ...
2026-06-11【核心关键词】企业、定位、传统、产品、互联网、可视化、业务侧、数字化、结构化、数据分析、传统制造业、市场状态、发展空间 ...
2026-06-11 解读《CDA二级教材:量化策略分析(2025)》的全景结构与学习逻辑 ” CDA二级认证是企业招聘数据分析师时最常提及的证书门槛 ...
2026-06-11【核心关键词】药企、可视化、营销、分类、数据分析师、销售数据、业务人员、指导方向、分析报告、营销数据、营销医生 【专访摘 ...
2026-06-10在统计学分析、问卷调研、实验验证、业务复盘等场景中,卡方检验与 T 检验是应用最广泛的两类基础假设检验方法。前者专门处理分 ...
2026-06-10 很多数据分析师每天都在计算指标、制作报表,但当被问到“什么叫指标数据元”“指标数据标准包含哪些核心维度”“指标数据质 ...
2026-06-10在MySQL数据库日常查询、数据统计、后台接口开发、数据导出等场景中,开发者经常需要查询数据表除某几列之外的所有字段。例如查 ...
2026-06-09在Python网络请求、爬虫开发、接口测试、数据抓取等实操场景中,requests库是最常用的第三方请求工具,而content属性是requests ...
2026-06-09 数据分析正在重塑每一个行业。CDA认证的三本官方教材,分别对应Level I、Level II、Level III,为你铺就从业务数据分析到数 ...
2026-06-09在数字财务、智慧财税、业财融合深度推进的当下,传统财务模式下数据标准混乱、业务流程碎片化、知识无法沉淀、系统互通性差等问 ...
2026-06-08随着数字经济深度渗透各行各业,数据正式成为继土地、劳动力、资本、技术之后的第五大生产要素,是企业数字化转型、精细化运营、 ...
2026-06-08 很多数据分析师能熟练写SQL、做透视表,但当被问到“数据是从哪里来的?经过哪些加工才进入数据仓库?ETL具体做了什么?”时 ...
2026-06-08【核心关键词】贷款、报表、课程、专业、建模、缺失值、营销、互联网、银行、办公自动化、数据分析、数据预处理、特征工程、贷 ...
2026-06-05在数据库数据查询、业务报表统计、多表关联分析中,LEFT JOIN左连接是使用率最高的SQL关联查询语句。其核心特性是保留左表全部数 ...
2026-06-05