爬虫,这个词不少朋友第一次听到,第一感受应该是各类小虫子,应该不会和某种计算机技术联系在一块儿。我第一次听到这个词,就是这样一个感受。可是当这个这个词前面加了网络二字时,瞬间勾起了个人兴趣,固然也带来了疑问。好比,网络爬虫是什么?有什么用?后来带着强烈的兴趣和疑问,查询了不少资料,以求搞清除个人疑问。当个人疑问被解决的解决以后,怀着对爬虫技术崇敬的心情作了一个决定,我要实现一个属于本身的爬虫程序。在我作这个决定的时候,时间节点是大三上学期期末。后来,过完寒假,到了大三下学期。我在大三下全学期用了3个月的时间,设计并实现了本身的爬虫,而且花了5天的间用本身写的爬虫采集了100万个网页。这是我第一次与爬虫技术亲密接触,整体感受良好,学到了不少东西。到了大四上学期的期末,到了论文选题的时候了,我选了一个关于全文搜索引擎的论文题目,论文对应的程序由爬虫和搜索两个模块组成。其中爬虫直接用的开源实现 WebMagic,不过因为 WebMagic 不符合个人需求,因此我对 WebMagic 源码进行了必定的改动,以保证爬虫按照个人要求来执行任务。这是我第二次接触爬虫技术,当时感受也不错,改了别人的源码,而且新加了一些新东西。改造完别人的爬虫不久以后,就毕业了,大学生活也结束了。git
以上,是我大学时候所接触过的爬虫技术。当我参加工做后,我所在的公司也有爬虫,我也须要常用。因此从大三下开始接触爬虫到如今,算起来也有两年半的时间了。这两年多来,从大三开始本身写爬虫,大四改造别人的爬虫,到如今用公司的爬虫。我在爬虫方面多多少少仍是积累了一些经验,也有一点感触吧。看着本身之前写的爬虫的截图,仍是蛮感叹的,时间过得真快啊。因此本篇文章我将把我这两年多使用爬虫的经历写出来,不过仅仅是记事,不会介绍爬虫相关的原理。接下来我会按照时间顺序依次叙述个人爬虫经历,好了,开始吧。github
我在大三上学期期末的时候,开始在自学 Python。当时感受 Python 仍是比较容易的学的,可是经过看书学习的话,基本上看完就忘。对此,我也是颇为苦恼。因而后来总结缘由,以为是本身代码写的太少,以致于记不住语法。因此就寻思着写一个稍微复杂的 Python 程序,这样才能熟悉 Python。因而乎上网找练手项目,找了一圈,多数人都是推荐用 Python 写爬虫。但当时以为爬虫技术很复杂,因此心里仍是比较拒绝的,不过既然你们都建议用 Python 写爬虫,那就硬着头皮上吧。因而,在一个风高月黑的夜晚,入坑了。web
在我开始准备写爬虫的时候,脑子真是一片空白。在此以前,我历来没接触过爬虫相关的技术,也没用过爬虫框架。在准备阶段,我查了很多资料,也写了不少小例子。准备工做结束后,我对爬虫相关的原理有了较为清晰的认识了,对 Python 的网络相关的库也相对熟练了不少。因而颇有自信的开始规划爬虫的编码计划,按照原计划,预计耗时一个半月能够完成爬虫的编码工做。不过在真正动手写代码以后,深深的体会到了“理想很丰满,现实很骨干”这句话的含义。因为当时没有经验,编码过程当中犯了不少错。从一开始的技术选型到实际编码过程当中,本身给本身挖了一个又一个的坑。好比在技术选型阶段,选择了一个难度比较大的并发模型,直接提高了开发难度。另外,在编码的过程当中,也犯了一个比较大的错误。即在初版实现还没发布前,不断的加入新功能,致使初版的爬虫迟迟出不来,项目最终延期。最后我耗费了3个月的时间,才把初版的爬虫发布出来,比预计时间多出一倍。固然,尽管犯了不少错,但最终仍是完成了编写爬虫的计划。总的来讲,收获仍是很大的。后面我会把初版爬虫所实现的功能点列出来,不过在列以前,先来看看当时爬虫的一些设计图。chrome
图1 爬虫并发模型:多进程+协程编程
图2 爬虫结构图服务器
下面来罗列一下初版爬虫实现的功能:网络
以上功能点是我在编码过程当中陆续加入的,这些功能的加入,直接致使了爬虫初版实现工期严重延误。同时在编码的过程当中我也踩了不少的坑,固然多数时候都是本身给本身挖的坑,这其中令我印象最深的坑非我选的爬虫并发模型莫属了。上面说到了我选择多进程加协程做为并发模型,是由于担忧 Python GIL 锁会限制多线程模型的效率。这个模型不用还好,用了以后感受多太复杂了。首先使用多进程增长了调试的难度,必需要使用远程调试。其次若是使用协程,基本能够告别调试了,协程调试起来很容易乱掉,因此只能靠打日志。这都不算什么,最坑的是当时我代码中的协程逻辑不按照预期运行,协程切换很诡异,调试了三天也没找到缘由。最后实在没办法,上网求助。最后在知乎上找到了一个 Python 大神,请他在他的电脑上运行个人代码,看看是否正常。结果他那边回邮件说正常,并将打印的日志截图给我。这个就让我很郁闷了,最后这个问题怎么解决的我也忘了,应该是改代码规避了。还有其余一些坑,这里就很少说了。多线程
在个人爬虫写完并测试好后,就开始正式采数据。个人计划是采集100万个网页,并对采集结果进行一些简单的数据分析。当个人爬虫在我那4M的网速上吭哧吭哧的运行了5天以后,数据采集终于完成了。采集的过程当中,我也是兢兢业业,天天上完课立马跑回寝室看看爬虫的运行状态,生怕爬虫挂了。我清楚的记得当数据采集到九十多万条时,我几乎没离开本身的座位,全程盯着爬虫采完余下的几万条数据。待到爬虫采集数量达到100万条时,当时兴奋的差点没从座位上跳起来,实在太开心了。如今回想起来,也仍是比较欣慰的。当时感受真的不容易,那段时间除了上课,剩下全部的空闲时间都拿来写代码(BUG)了。最关键的是,整个编码过程至始至终只有我一我的参与,没有队友。固然,这并不算什么。可是若是一旦碰到比较难的问题,一我的就很郁闷了,连个讨论的人都没有,只能一我的去想办法解决。好在皇天不负有心人,最终仍是完成了。虽然当时花了这么长的时间,仅仅实现了一个较为简单的爬虫。但对于当时的我来讲,这已经够了,我从这个过程当中仍是学到了不少东西。同时,这也是我大学生活一段令我印象深入的经历,无论怎么说,都值得了。并发
上面唠唠叨叨的说了不少,不过这仍然不是所有,还有不少细节我已经想不起来了。接下来,给你们看看我当时写的爬虫的样子吧,很简陋,见笑了。框架
图3 爬虫启动界面
图4 爬虫运行界面
你们能够看到“图3 爬虫启动界面”中的 wormhole 字样,wormhole 也就是个人爬虫名称,这个是我一个字母一个字母敲出来的。图4是在爬虫运行了5个小时以后截取的,里面包含了任务总数、完成的任务数、采集失败的页面数量和比例、以及当前的采集速度等的。如今看看这两张图,内容虽间简陋,但感受仍是很亲切的。另外,在爬虫完成抓取任务后,我还煞有介事的对采集到的数据进行了一些简单的分析。好比不一样网站所使用的操做系统、脚本语言以及服务器软件分布比例等。以下:
图5 数据分析
上面的数据分析是依赖于消息头进行的,但这样并不精确。因此参考价值不大,不过也仍是有点意思的。
以上就是我与爬虫技术第一次亲密接触的过程,此次的接触,令我印象深入。在编写爬虫的过程当中,不但达到了最初的目的--熟悉 Python 编程,也顺带学习了不少技术。好比 MongoDB、Bloom Filter、协程等等。尽管写这个爬虫耗费了我三个月时间,但从最后的收益来看,这笔投资仍是很值得的。若是用大学里常常听到的一句话总结,那就是:“这波不亏”。
好了,偶遇爬虫篇,就先说到这了。接下来再来讲说大四的利用爬虫作毕业设计的事情。
时间过得很快,在我写完本身的爬虫不就,大三就结束了。紧接着到了大四,大四上学期快结束时,咱们要进行毕业论文选题了。对于毕业论文选题这个事情,我当时的想法很简单。必定要选一个看起来稍微复杂一点的论文,而后认真完成,并以此论文来为个人大学生活画上句号。因此思考良久,最终选了基于 Lucene 的全文搜索引擎做为毕设。固然选完以后,我就开开心心的跑出去实习去了,没再管它了。以致于在毕业答辩的前一个半月,答辩老师让咱们提交答辩申请表的时候,我才想起来还有毕业论文和设计没准备这回事。因而这就悲剧了,总共一个半月的时间,要留一周的时间进行论文查重和修改,同时答辩前一周还要提交论文最终版,因此真正留给我作毕业设计的时间只有一个月。当时真是急死了,因而最后和公司申请在上班时间写毕业设计,好在公司答应了个人申请,就这样我用了一个月的完成了毕业论文和设计。
前面说了,个人毕业论文是关于全文搜索引擎的。看起来并不复杂,调调 Lucene API 就行了。可是,搜索引擎须要数据,而数据又须要拿爬虫去采集。因此个人毕业设计里不止要实现搜索逻辑,还要附带实现数据采集逻辑。固然因为时间紧急,加上大三写的爬虫跑不起来了,因此就直接找开源的爬虫框架采数据了。找了一圈,最终选定了黄义华大神写的 WebMagic 做为个人数据采集工具。尽管当时 Nutch 爬虫是更好的选择,可是 Nutch 仍是比较复杂的。为了防止出岔子,就选了相对比较简单的 WebMagic。不过考虑到 WebMagic 工做模式不适合为搜索引擎采集数据,为了能让 WebMagic 符合个人需求,因此后来我对 WebMagic 源码进行了必定的改动。这样它就能同时采集不少个网站的数据,而且在发现新的网站后也会放在任务队列中,而不是像之前那样直接过滤掉。在 WebMagic 改造工做接近尾声时,我用 ExtJS 为 WebMagic 作了简陋的后台管理界面,方便我对采集过程进行监视。至于当时我是怎么改动 WebMagic 源码的,这里就不细说了,我也忘记了。关于改造 WebMagic 的事情就说到这里,下面来看看爬虫的结构图以及管理界面:
图7 毕业设计爬虫模块运行界面图
图8 新增任务图
最后再上两张毕业设计中搜索模块的界面,以下:
图9 搜索引擎首页
图10 搜索引擎结果页
以上是我在作毕业设计时,所接触过的爬虫。虽然并没什么亮点,可是在一个月内的时间里,改造别人的开源爬虫,并采集20W条数据,紧接着编写搜索逻辑,最后写毕业论文。整个过程到如今想一想,仍然仍是很刺激的。好在最后完成了,最终也达到了选题的初衷--经过认真完成毕业论文和设计,为大学生活画上句号。
大学毕业以后,我又是回到了先前实习的公司,并在拿到毕业证后转正了。由此,个人工做生涯开始了。
咱们公司是以给客户提供搜索服务起家的,既然是搜索服务,天然也离不开爬虫。公司的爬虫和业务贴合的比较近,相对于通用爬虫来讲,公司定制的爬虫仍是要复杂的多。拥有不少通用爬虫没有的功能,好比对列表页和详情页的识别、对网页正文的抽取(相似印象笔记的剪藏插件)等。同时,不一样于通用爬虫,咱们不少时候在采集客户的数据(客户不对咱们开放数据)时,常常须要处理各类由 JS 渲染的分页以及 Ajax 请求等状况。这类数据爬虫采集不了,这时候就须要人工参与了。怎样让人和爬虫协做,这也不是个简单问题。咱们公司的爬虫参考了 Nutch 的设计思想,因此也为爬虫实现了一个插件机制,这样就解决了人和爬虫协做的问题。固然具体怎样实现的,这里就不说了,详细能够参考 Nutch 的插件机制。
在我来到公司以前,公司的爬虫就已经存在了。在我一开始工做的时候,感受公司的爬虫仍是很高大上的,看起来挺复杂的。不过如今看来,也就通常了。设计思想还能够,但易用性不佳。不少能够自动化解决的问题,竟然一直都是以人工的方式处理的。举个例子,有一次,咱们公司的运维要检查爬虫抓取的数据是否完整。因而他按照惯例到客户的网站上,从不一样的栏目里复制几条数据的 url。而后再将这几条 url 一条一条的复制到爬虫控制台的搜索框中,看看能不能查找这条 url 的采集记录。这个过程相对来讲仍是比较繁琐的,特别检查多个网站数据的数据采集状况时,尤其的繁琐,效率十分低下。因此后来我实在看不下去了,就写了一个 chrome 插件,并在爬虫后台开放一组接口。这样利用插件批量将页面中的 url 发送给后台,后台检测完后,再将结果返回给 chrome 插件。插件根据检测结果,把未爬虫采集的数据标题标红,并加上删除线。这样哪些数据未被采集,一目了然,不再用手动检查了,效率也大大的提升了。
公司现有的爬虫平台已经比较老了,有两三年了,目前看来已经没法知足业务的需求了。虽然当时在设计上参考了 Nutch 的实现,但也只借鉴了思想,并未借鉴 Nutch 的实现。加之设计之初的技术选型有问题,选用了一些比较底层的技术,致使维护起来很困难。这里并非说底层技术很差,而是咱们公司没把它用好。因此公司的爬虫自从写出来后,几乎没更新过,只是偶尔打个 patch,仅此而已。因此你们在作技术选型的时候,好事要慎重考虑,否则之后维护工做是个大麻烦。关于公司的爬虫就说到这里,保密缘由,这里就不贴图了。
以上就是我这两年多学习并使用爬虫的历程,虽无什么亮点,可是对我来讲却会比较难忘。从之前不知爬虫为什么物,到今天能够用爬虫作不少事情。总的来讲,仍是有比较大的进步吧。固然,我并不非专业的爬虫工程师,使用爬虫也只是平时工做的一部分而已。不过即便如此,我仍然以为数据采集工做并非个轻松的差事,很繁琐。固然了,如今除了工做须要,其余时间我几乎不会再关注爬虫技术了。我并不打算成为爬虫工程师,因此这方面的技术够用就好了。也由于此,写下这篇文章记录本身的过往经历,也算是给本身的爬虫之路画上一个句号吧。over!
本文在知识共享许可协议 4.0 下发布,转载请注明出处
做者:coolblog
为了得到更好的分类阅读体验,
请移步至本人的我的博客: http://www.coolblog.xyz
本做品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。