ITPub博客

首页 > > > 爬虫技术学习:路在何方?

爬虫技术学习:路在何方?

作者:浪花小雨滴 时间:2019-02-03 12:21:18 0 删除 编辑

作者:黄天元,复旦大学博士在读,热爱数据科学与R,热衷推广R在工业界与学术界的应用。邮箱:huang.tian-yuan@qq.com.欢迎合作交流


利益相关:

近日放假终于有时间玩爬虫,有幸得到"天善智能"赠课崔庆才老师的Python爬虫视频课,配合崔庆才的《Python 3网络爬虫开发实战》,开始进行概览模式的学习。又赶上211统计公司年末倾情送课,一口气刷了姚树亮老师的《R语言爬虫开发教程》和蒋老师的《R爬虫初级教程》的视频。本来希望系统地做一点东西,但是经过认真思考,还是写下这一篇文章,然后暂告一段落。


爬虫的根本:数据获取的一个重要手段

之所以要学习爬虫,其实只有一个目的:获取数据。因此,任何人做爬虫之前都需要考虑的一个问题是:这个数据能不能不用爬虫就能够直接获得?既然这个数据放在网上,肯定是有人或者机构在上传这些数据。如果能够联系这些人或者机构,直接获得这个数据,这是最好的。不战而屈人之兵,善哉,不爬不爬!特别是科学研究的数据,很多机构会主动开发API让大家自助调用他们的公共数据库,其实不需要费劲写复杂的爬虫。即使对方数据库不够完善,也可以尝试直接联系数据管理人进行合作。无论如何,爬虫不应该是数据寻觅者的第一选择。

爬虫的兴盛,在于两点:1.数据所有者没有良好的数据共享机制和技术;2.数据本身属于资产,不支持共享。简单来说,如果作为数据管理者,我发现很多人来爬我的数据,我就应该反思:我是不是应该做一个产品让大家更好地获得这个数据,或者是这个数据的衍生品(经过分析后的图、表)。这在学术界很常见,在国外已经有成熟的产品,大大推进了学术界的繁荣发展。当然,如果作为数据产品的提供方,辛辛苦苦收集的数据简单地让别人爬走,应该还是挺难受的。如果数据本身属于资产,那么对这些数据的爬虫行为无异于盗窃。我们看爬虫的一些技术就能够知道其本质:设置多个代理模拟多用户行为、验证码识别、修饰递交请求的头文件等等。如果要继续登峰造极,后面应该就是破译密码直接访问对方的数据库了。那么就开始了无休止的网络安全攻防战,商战的一方要给自己的数据资源上锁,另一方就是为了掠夺数据资源而使用爬虫制作各种精致的钥匙。能够制造好的锁和钥匙的数据公司,将会成为最后的赢家。

作为技术的追求者,看到这种攻防大战真的是刺激,而且能够作为其中一方参与其中更是给爬虫或反爬的个人带来了极大的快感和成就感。但是同时作为数据使用者的我,认为这种黑客攻防的“协同进化”其实是业界内部的无谓消耗。大家不想着怎么做好自己的服务自己的产品,天天想着弄别人的数据来获得相对的竞争优势,这对于全人类的发展没有太多的好处。但是大环境下每个商家都在做数据,如果人有你无,这是无法立足的。也就是说,尽管更好的监管制度能够把大家从网络安全攻防战中解放出来。但是在目前技术和制度都尚未成熟的灰色地带中,爬虫就是每个依赖数据的企业获取优势资源的必要途径。

爬虫的基本技术:访问、接收、提取、存储

爬虫的技术,从实现来看,简单到一个帖子能演示,复杂到一本书都讲不完。这是因为每个人的需求不同,而所处场景又非常多样导致的。但是万变不离其宗,其实爬虫的根本原理就是去邻家借鸡蛋的过程。步骤如下:

  1. 访问:我想跟隔壁老王接俩鸡蛋做饭,我敲一下门。这在爬虫中就是发送请求的过程。
  2. 接收:老王怕是坏人,从猫眼里面看到是我,然后就打开了门。这在爬虫中就是对方服务器响应请求,并返回所请求数据的过程。
  3. 提取:老王给了我一盒鸡蛋,我要把鸡蛋从盒子里面拿出来。爬虫得到的原始数据往往是非结构化的,需要把这些非结构化数据转化为能够直接利用的数据。
  4. 存储:我把鸡蛋放在冰箱,用的时候随时拿出来。爬虫最后整理得到的数据,需要以一定的格式存放在硬盘中,不能一直放在我们做爬虫编程的环境中。

如果能够看懂上面的大白话,其实任何人都能够爬虫。不想编程的可以用诸如八爪鱼这种交互式的软件,而喜欢编程的小伙伴可以利用大量的复制粘贴代码来完成这个过程。随着技术的进步,这个过程将会越来越简单。如果过程变复杂了,说明这些过程背后的攻防大战又升级了,才把整个过程变得更加复杂了。单单是通过URL访问网址,然后得到网址利用xpath/CSS/正则表达式来提取感兴趣内容,最后存储为表格,这个过程及其简单。学问都在于,有人为了阻止爬虫,上了锁,于是各路大侠就根据锁的结构制造钥匙。关于这方面的知识,是无止境的,学一辈子也没用,很快就会有新的锁和新的钥匙,需要能够及时迎接变化的技术专家不断革新技术来维持双方的平衡。

个人观点:万能钥匙是不存在的,但是“一夫当关万夫莫开”的锁是值得探讨的。

爬虫的工具:R or Python?

这个问题是幼稚的,但是却又值得去问,因此我还是提出来。

Python爬虫框架比R多,丰富多样,解决各种问题,包括验证码识别、设置代理等等。R的爬虫框架相对来说简单粗暴一些,但是切实有效。我先上结论(当然是自己的结论,仅供参考):如果从事科学研究或者商业的数据探索性分析工作,不想卷入法务问题,只是希望利用编程工具对一些公开的数据进行采集,首推R语言。这不是开玩笑,R的开发者以计算机出身的比较少,统计出身的很多。此外,做各类科学研究的科学家也在开发R语言,来共享他们的数据和处理数据的方法。因此科学家设计工具的本质诉求就是:让其他科学家能够轻易地交流各自的研究成果,包括数据本身和处理数据的方法。也就是说,R语言爬虫设计就是,数据提供方的数据就是让你爬的,而工具就是让大家非常便利地获得这些开放的数据。少了很多锁和钥匙的缠斗,让R在获取网络数据方便非常便捷,工具设计异常简单。

当我学习了几个R语言爬虫的包之后,发现很多公开数据具有R的API,其实不需要使用任何爬虫知识,只需要按照需求来写请求就好,数据自动就安全地进入我的碗里。数据提供方很高兴自己的数据能够被更多的人利用,而数据获得者也很开心能够获得更多的数据来进行研究和探索。皆大欢喜!

如果要做计算机网络安全攻防,Python为首选,但是它绝不是你要学的唯一一门语言。在了解了Python的爬虫之后,我跟R做了一个比较。如果单单是说得到了请求的数据之后,从里面提取感兴趣的内容,两种语言基本没有任何差距。甚至是R语言在数据提取中有更加好的工具,因为它在处理数据方面具有出色的表现。但是一旦涉及计算机网络基本原理,那么Python就脱颖而出了。Python更加适合工程化地设计爬虫项目,更多的工程师愿意用Python来写爬虫,来公布自己爬虫框架的源码来分享,吹一下我今天又用什么方法开了几个锁。今天有人要破12306验证码,明天又想同时登陆多个账号开始抢票。这些内容都涉及了网络基本原理的核心内容,它并不是那么好上手,需要程序员对网络基本原理有非常深入的了解。而且要解决这些问题,Python一门语言绝对不够,JAVA和C++都是你的朋友。这是一个学习成本极高的过程,如果不是立志做网络安全管理和爬虫工程师的,入这个坑需要谨慎。

当然,不是说Python就不能够用来爬学术数据了。Python的框架比R更加灵活而自由,因此R在爬虫上实现的功能永远都是Python的一个子集。只有R爬不到Python能爬的,没见过Python爬不到R却能爬到的。只是为了得到这个灵活性,需要付出更多的学习成本,特别是对计算机网络原理的学习成本。值不值得,见仁见智。

无论R还是Python,一个好的编程工具就应该能够让大家通过复制粘贴代码就能够实现其核心功能,不能达到这点的,都是扯淡。从这个角度上来说,我认为R做的跟Python一样好,甚至是更好。R语言的很多用户在致力于如何让大家更好地获得和利用数据,而Python的用户则正好相反。这就是工业界与学术界的重要差别。但是这也是一个伪命题,Python和R都注重开源,讲求分享。如果商业界的本质是竞争,那么好的爬虫框架就不应该被公开,而是藏在企业里面。这样将不利于技术开发的发展,导致最后走向死胡同。因此,Python在爬虫攻防战的优势,实质上是一个零和博弈。一个无所不能的爬虫工程师,明天就可能去另一个公司做反爬管理员,这个时候作为爬虫工程师的你还愿意跟他共享爬虫的知识吗?

爬虫,从入门到放弃?

所以作为个人,我们要不要学习爬虫?要学到什么程度?

第一个问题,要不要?答案很简单,要。作为数据获取的重要手段,所有以数据为导向的数据分析师、数据工程师、数据科学家、科学研究者都应该掌握一定程度的爬虫能力,然后在需要采集网络数据的时候,能够部署代码来自动化这个过程。对于不涉及网络安全攻防的用户,使用R和Python爬虫没有太大区别。它们深层次的网络基本原理都是类似的,实现也不归我们数据使用者管,因此没差。顺手就好,掌握一套基本框架,然后在需要的时候随时扩展。

第二个问题,学到什么程度?这就看个人了,我的建议就是:需要有分辨哪些知识是通用的(general),哪些知识仅仅针对特定领域,然后优先关注通用的框架型知识。我在学习崔庆才教程的时候,第一章部署环境差不多花了一天时间,但是能够用到这么多工具吗?不一定。比如有个识别图片验证码的插件,我就不一定能用上。如果不难学,到无所谓。如果学习的过程要花费很多时间了解原理,并花费时间来做参数设置和部署,这就不值当了。当然以后遇到这个问题,能够在这本书随时找到这个方法并用上,棒棒!因此,你可以不去真正学习每一项技能,但是你必须知道它们的存在,并在要用的时候知道去哪里找。了解了一套框架之后,就可以停止学习了。在知识爆炸的21世纪,要成为全栈数据科学家(以前还有叫博物学家的),就需要不断了解这些最优秀的框架,并灵活地组合这些框架、拓展这些框架,从而得到业务上的增值或科学问题的解决。

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39850