一只真正的爬虫

我看了假的爬虫教程

说起爬虫,最容易想到的还是各个搜索引擎放出来的爬虫无时无刻的收集互联网上的信息。但对于不做搜索引擎的人来说,爬虫很多时候意味着定向的采集一些指定的数据信息。很不好意思跟别人说我会写这种爬虫,而且还有点擅长。似乎一提写爬虫,就会被嗤之以鼻,尤其是遇到各路程序猿:“不就是写点小脚本发送请求访问个页面嘛。”从原理上说,也确实就是发送个页面请求,没有什么好反驳的,再加上网上大把的经典爬虫教程。很多人学习python的一个重要动机就是要写爬虫。我也认真看过那些教程,但如果要写100只爬虫,岂不就是重复的复制粘贴代码?怎么看怎么都觉得那些教程是个requests或者urllib的教程,不是爬虫教程啊!

规模灾难

复制粘贴也要时间
前面提到过,按照教程方法,写1只那样爬虫没有任何问题,但是要写100只爬虫,那样的方法就变成重复复制粘贴的事情,倘若半小时写一只爬虫,100只爬虫就要50小时,还不包括执行这些爬虫的时间。可想而知,如果按这样的方式做,可以预计我会花一整周多的时间复制粘贴出100只爬虫,然后再用一周时间挨个执行一遍,再花一两周时间检查其中的错误,一个月时间已经过去。如果其中存在错误,又开始重复上个月的事情再做一次,周而复始,一年时间过去了。实际情况是我们目前有超过200只爬虫,而且有增无减的趋势逐渐增强,紧缺的人力资源迫使我们长期只能投入1~1.5人。

干瞪眼
有了几百只爬虫,总不能全部同时运行吧。服务器的资源总是有限的,再多资源也不够用,一次只能执行有限数量的任务,总不能像前面描述那样,每过一段时间就看看机器有没有任务完成,释放了足够的资源来执行新的任务。一天无时无刻的盯着服务器,很快就疲劳厌倦了,还不说有的任务,一次就占满了机器的全资源,不多会儿,服务器就歇菜了。

花钱不办事
花了不少钱,买了服务器,买了昂贵的网络带宽,最不值当的事情就是机器偶尔超负荷运转,多数时间都限制没活可干,真是心疼花出去的钱几乎什么都没干。如果能把那些超负荷运转的任务平摊到不同时间段运行,机器的利用率就得到提升,任务也能够按照优先级先后执行,保证关键任务的完成。

数据不是你想抓就能抓到
互联网上的资源,但当你想大规模的查阅、收集、整理这些数据时,你会发现对方不希望你这样做,会设立各种各样拐弯抹角的招数阻止你的机器兄弟们地毯式收割。更有甚者,虚晃一枪,来个蜜罐,兄弟们掉进去晕头转向,分不清是非曲直,瞎了双眼。

后院起火
很多技术文章从浅到深或多或少都会谈及以上问题该如何解决应对,但少有文章谈论这些爬虫、数据维护的相关事宜。

  • 数据如果不更新,时间长了就没什么价值,每次更新数据都当成新一次抓取任务的话,为了节省时间金钱,能不能只更新那些变动了的信息呢?
  • 如果1只爬虫由多个人维护,其中新增了所需的数据信息,要如何才能及时的让所有人知道呢?
  • 数据信息尤其是那些特殊类型的数据,比如数值、时间信息经常会用来做各种筛选和计算的条件,如何保证任何人可以用同样的方式方法去分析操作这些数据而且绝对不会出错呢?
  • 如何避免人口、房价、消费之类的数据绝对不会由于手抖而出现负数的情况呢?
  • 最要命的是很多数据存在一对多的关系,即一套房总会有若干个房价,在茫茫几亿条数据中,如何保证这些关系绝对不会出错呢?
  • 同样的一个信息,或许可以从N多个来源获取得到,怎么知道他们是同一个信息的不同表述呢?
  • 更要命的是,你真的觉得你抓取到的数据就是真实准确的?图样图森破。
  • 更加灾难性问题是,几百只爬虫放出去的时候很开心,但是收割清点的时候,发现有些哥们儿离家出走没有回来,有的抱回家一堆莫名其妙的东西时,会感到伤感和无奈。我怎么可能清楚的知道到底是谁没回来,是谁带回了这些奇怪的东西。

写程序很开心,尤其是python,洋洋洒洒几十上百行,三下五除二就搞定了,一运行,一堆bug就不知从哪里神奇地冒了出来。有心得的同学都知道,60%~70%的时间都是在各种程序调试中度过,有时候一个愚蠢至极的问题能够耽误几个小时时间。可以想象写一只爬虫应该不费事,一眼看上去颇为简单,但是写一堆爬虫简直就是灾难,背后踩的雷,躺的坑数不胜数。

精工细活

有一件事情特别欣慰,上面描述的灾难在我们这儿几乎绝迹,昨天写了一只能够自动更新、出错报警、绕过陷阱、无人值守、数据即拿即用、维护成本几乎为0的爬虫,并且部署运行,耗时15分钟。其中到底做了哪些不可描述的事情,欢迎大家关注我们在WGDC2017地理信息开发者大会的GeoHey专场会议中的议程。

Map Gallery https://geohey.com/gallery/gmchocolate

欢迎从GeoHey获取地理和位置相关的数据、知识、服务

访问网站 http://geohey.com

联系我们 contact@geohey.com

QQ群 164183186

长按扫码关注公众号