全网最全网络数据采集(爬虫)指南

  1. 云栖社区>
  2. 博客>
  3. 正文

全网最全网络数据采集(爬虫)指南

iamastone 2019-03-07 15:05:46 浏览11388
展开阅读全文

本chat主要从以下6个方面来展开

  • 爬虫的来由,应用场景,数据价值
  • 爬虫技术开发语言和开发框架选型
  • 爬虫国内外产品竞品分析
  • 爬虫技术应用延伸拓展
  • 分布式企业级爬虫实践

首先本chat旨在让大家对爬虫形成,价值,实现,周边等有一个全面的认识,而不是事无巨细的讲解爬虫的各种具体实现,如果大家有这方面的兴趣和具体爬虫问题可以线上和建微信群就交流


1、爬虫的来由,应用场景,价值

这是一个爬虫肆掠横行的年代,且看各种爬虫教学视频,付费课程大行其道,甚至搭着数据挖掘分析和大数据一起,着实很紧俏,话说笔者也是这个行业的一个资深的爬虫老人了,在此也不罗嗦,赶紧把爬虫的各种道道,技术流派和渊源给你梳理讲讲。

话说这世上本没有爬虫,只是因为有了web,才有了爬虫,是的,目前市面上说的爬虫基本上是围绕web网页的,甚至很多技术栈和框架也是围绕web技术趋势来发展的,但只是其一,目前也有很多围绕app来做的爬虫,当然实现起来也就更难了,这里后面会细细道来,其实在谈数据采集之前,我们应该先思考另外一个问题,为何采集爬取数据,只有回答了这个问题,才能理解为什么爬虫这个行业这么火爆,在严刑峻法之前依然有这么多前仆后继,我是这么理解的,围绕数据采集有以下使用场景,且有利益输送,在列举之前,不得不说,这是一个大数据的时代,数据就是价值就是金钱(你肯定反驳那不一定非得爬呀,只能说你太年轻,有数据的公司太少了,毕竟不是BAT:

  • 1、搜索引擎公司,不得不说,谷歌百度等搜索引擎公司是最大的爬虫公司,只不过别人找到了目前截止目前信息时代数据最好的变现商业产品而已。
  • 2、舆情分析,这绝对是爬虫数据被综合利用设计后很好的实现场景之二,比如百度,谷歌,搜狗,微博等排行榜或者舆情分析产品。
  • 3、买数据的公司,或者数据聚合的公司,比如天眼查,企查查,西瓜数据等等。
  • 4、导购,价格监测,运营助手,或者横向数据聚合的公司等,以此为生的产品衍生的小公司就不一一列举了。
  • 5、黑产,灰产,刷量,排行榜,搬砖等,比如前期被判刑的美剧天堂还是什么公司就是这样的,这样的个人,团伙也是不少的。
  • 6、广告公司,比如新榜,清博数据等围绕微信,微博等社交媒体的公司。

总之以此爬虫拿公开或者非公开的数据价值来为自己赚钱即是人性,所以你很难说把这个行业给消灭掉,话说还有很多公司是希望自己的产品被人爬呢?只要在法律的准绳之内,遵循robots协议,大家还是可以很好的玩耍的。

反正已经啰嗦了这么多,我们还是继续来说爬虫和大数据的关系吧,上面也讲了,真的有很好的数据覆盖面的公司毕竟不多,讲到了数据,以我有限的经验来说,企业的数据无非有以下几个来源:

  • 1、数据库(这里的数据库是泛指,有可能是文件,关系型数据库或列存储数据)里数据,包括自己的业务数据,价值密度应该最高的。
  • 2、埋点数据,当前以友盟,百度,talkingdata等为首的web或者app埋点数据厂商,当然也可以自己开发埋点数据工具来收集数据。
  • 3、日志数据,包括系统,应用,网络等数据,价值密度相对较小,这里也涉及到很多技术,后面公司会单独来聊聊。
  • 4、爬虫或者外部采集数据,对,网络采集数据作为企业内部数据一个很好的补充,也是有相当价值的,这也是为什么很多公司有专门的爬虫公司一职。

2、爬虫技术语言和技术框架选型

1、python

a)、谈到爬虫具体的实现框架,我首推python语言家族的scrapy,没有之一,当之无愧的爬虫一哥,作为爬虫框架,他可扩展性,易用性,稳定程度都极佳,如果非得找一点缺陷,那就是性能和分布式这块相对单薄了一点,但作为底层的数据抓取已经可以胜任一般企业的爬虫需求,这里推荐一个组合 scrapy + scrapyd + celery,味道极佳,至于具体如何操作,后面的章节会一一道来。

b)、第二推荐的当然是pyspider,作为国内大神开源的爬虫框架也是可圈可点,小巧,易用,高效,但在稳定性和可扩展以及功能丰富程度上上在我看来不及scrapy。

以上两个是我极力推荐的两个python爬虫框架,至于其他工具或者类库,比如requests/xpath等页面请求解析库等更是数不胜数,具体场景捡适当的来补充即可,对于灵活性和场景多变,且对于稳定性有较高要求的场景我建议优先使用scrapy框架,其余情况可以考虑pyspider,毕竟更容易上手,拿来即用,用完就走哈。

2、java和go

其实以我看,jvm体系下的编程语言,特别是java,目前还没有一款一统天下的爬虫框架,比如webmagic,spiderman2,crawler4j,Gecco,SeimiCrawler,nutch等等,至于以上的每个java爬虫框架我基本都有涉猎,其中个人觉得spiderman2作为学习java是一个不错的框架,代码范式和风格很漂亮,对于要提高自己java编程能力的同学可以反复研读一下,其次webmagic作为java体系下的爬虫框架,据我所知,国内不少同学比较喜欢它,最后说下nutch,其实它更像一个搜索引擎,但大部分情况被当做爬虫框架来用,也是众多框架下唯一一个真正意义上支持分布式的,底层是采用hadoop来做,特别是nutch2.x以后,使用gora支持众多底层存储,但是,请注意,我要说的是,为什么java作为爬虫开发语言,我以为是不太合适的,作为一门编译型的静态语言,尽管在效率上有优势,但还是显得过于笨重,特别是爬虫所面对的复杂多变的场景,在这里我就不一一阐述每一种java框架的具体使用,大家如果有使用上的问题可以线上和建群交流。

3、nodejs

对,我把nodejs作为第三种合适爬虫开发的编程语言,有可能java和go语言开发的同学不服,但是nodejs才是爬虫的亲兄弟啊,比较nodejs底层是跑在浏览器上,所以从血缘上来看,它处理网页数据肯定是得心应手啊,尽管也有不少nodejs的爬虫框架,但缺乏杀手级爬虫框架,其实这很重要,尤其这种大杀器级别的应用,甚至能带动一门编程语言的发展,比如docker/k8s之于go, spark之于scala,这里还是列举一些我试用过的nodejs爬虫框架:
headless-chrome-crawler 这是一位日本小哥开发的
node-crawler
感兴趣的同学可以尝尝鲜,
这里打个广告,个人基于nodejs开发的一个爬虫小产品年后会发布上线

到此,爬虫编程语言和框架的选型上就到这里了,如果在语言不是问题的前提下,开发生产或者企业级爬虫应用,我的建议是:

python > jvm体系 + go > nodejs

首先考量的不是性能问题,而是语言的匹配程度上,首先得考虑可调试维护性,成本和稳定性上,爬虫很多情况下,是多变的,反爬引起的朝夕改,动态解释型的脚本语言更合适。

3、爬虫产品竞品分析

首先我来翻一下国外的爬虫和数据挖掘的公司:

1、diffbot

这是被腾讯资本加持的一家人工智能公司,通过人工智能技术,让“机器”识别网页内容,抓取关键内容,并输出软件可以直接识别的结构化数据,并且该公司号称自己拥有业界最大的知识图谱,怪不得它能被腾讯看上,敢情是披上了人工智能的外衣的高级数据采集公司,目前该公司拥有三款产品,主要是saas模式,算是目前了解的爬虫技术公司里博得头筹的一家公司了,当然一些大厂,比如谷歌,雅虎内部也有这样的系统,但没有轻易示人。

2、import.io

相比较diffbot,这家爬虫技术公司从产品到解决方案输出,还是覆盖得比较全面,同时也提供了强大的可视化爬虫界面,少却了人工智能的马甲,也是爬虫界里踏踏实实的一家公司了,主要模式也是saas,同时提供数据抽取解析转换,然后通过api的方式输出,至于用到的技术还没发深入细究。

3、scrapinghub

官网:https://scrapinghub.com/,它作为scrapy开源框架背后的商业公司,首先给一个大大的赞,毕竟把scrapy这么优秀的爬虫框架开源了,还是造福了不少爬虫工程师啊,只不过scrapinghub作为云上版本,退出了一些付费服务,包括代理ip,splash,cloud等,同时scrapinghub的开源版本也提供了portia这样可视化的功能,相信对于不少爬虫小白还是相当友好的,但个人认为使用场景有限,如何玩转scrapinghub,我也会在后续的爬虫技术篇中帮大家一起来梳理实战一下,总之对于想从事爬虫事业的同学来说,这个项目和产品是不得不关注的。

4、apify

该公司提供的产品从页面和功能,就是我比较喜欢的范,简单大方实用,为什么实用呢?首先它的定位就是面向一线开发者,提供了利用js代码实现爬虫逻辑,我这里不是说可视化爬虫技术就多么不好,只是我理解爬虫从一开始就不是一个人人可用可玩的玩具或者消费品,当然我后面也会讲为什么我这么理解,既然提供了可编程的模式,我相信apify的实用性,同时apify也提供了一些类似actor这样的高级特性,笔者猜测只是使用了一些虚拟化的技术来让实现租户资源权限隔离。

国外的公司就先列出以上这四家比较具有代表性的公司,其它大大小小的公司肯定也是不少的,在此就不一一列举了,接下来该上点中国菜了。

5、神箭手

作为国内我首推的爬虫技术公司,它的定位是大数据+AI的云os,定位归定位,我看到的它只是一家卖爬虫和数据的公司,AI能力我反正是看不到,就不和diffbot做比较了,实在没有可比性,当然作为国内市场的爬虫一哥,它也是有自己独特之处的,比如它也提供了js可编程能力的爬虫视窗,而且最近也提供了基于scrapy框架的云爬虫开发环境,说白了,他们提供的js开发爬虫环境功能凑合,笔者也是做了专门研究,底层不是使用v8引擎来实现的,而是通过java8的Nashorn引擎做的,整个技术栈基本围绕java+php,但我还是觉得他们产方向和定位还是不错,还需要提升自己来打破市场证明自己。

6、八爪鱼

作为深圳的一家爬虫技术公司,和神箭手的定位还是有所差异,毕竟从产品设计上来看,神箭手更偏互联网化,而八爪鱼更像是在提供一个工具,面向B端客户,更保守一点,同时也提供了可视化客户端帮助爬虫小白快速入手,也提供了一些行业解决方案,尽管它也提供了saas收费模式。

7、造数

从官网和产品设计风格来看,该公司主打的是可视化爬虫和互联网玩法,但不得不说,产品功能稍显粗糙,且对于爬虫的理解不是非常深刻,有可能是我了解的比较片面吧。

以上也分析了国内国外7家爬虫产品,基本内核就是将web的非结构化数据结构化的工程,只是说使用的技术和产品表达形式有差异而已,不管你是用人工智能深度学习,亦或是无监督的机器学习算法,还是使用简单粗暴的方式,解决的只是规模化和人力成本问题,但愿这些对你有所启发,到此产品竞品篇以结束,也许还很浅薄,但愿后面还能有时间精力把这些竞品分析得更彻底完整一点吧。

最后也谈下我对国内外做此类产品的一点差异吧,国外确实比国内要高不少,同时大家也能看出来纯粹地做爬虫技术平台,没有特别大的公司,或者直接说不值钱,而以爬虫技术作为基座,上面做出解决问题的应用或者产品才能做大做强,在某些时候这或许就是技术或者技术人的悲哀吧。

4、爬虫相关技术延伸与拓展

前面漫谈了网络数据采集系统的使用场景,价值,以及不同语言开源框架技术实现选型,以及国内外商业化爬虫产品的竞品分析,本章继续沿着这个方向和大家讲讲爬虫所涉及到的技术除了能够采集网络数据,还能做什么,包括前面也有提到,所谓的爬虫主要泛指web数据采集,其实还有一个方向就是app数据采集,网络数据采集的技术方案,除了能够采集数据以外,与此一脉相承的还有就是页面自动化测试,再就是app真机云端自动化测试等领域;

关于web方向做自动化测试我这里提出两个常规且使用广泛的框架:

1、selenium

Selenium automates browsers. That's it! What you do with that power is entirely up to you. Primarily, it is for automating web applications for testing purposes, but is certainly not limited to just that. Boring web-based administration tasks can (and should!) be automated as well.

你没看错,本来作为web自动化测试框架,但硬生生被广大爬虫工程师给整成了一个爬虫框架,selenium功不可没,[这里插入一段selenium的专业解释],这里还是要归功于当前各大浏览器厂商均提供了web driver api的方式来提供远程自动化操作浏览器,不管你页面多复杂异步的页面,页面的反爬逻辑多复杂,只要祭上selenium,一切均消失于无形,因为它让你可以真实地模拟人在操作,当然这其中的注意事项和操作细节就很多了,如果说scrapy是我心目中处理同步页面最全面最好用的爬虫框架(尽管也提供了splash解决方案),那么selenium则是处理异步网页数据抓取的最佳选择了,至今也是使用最广泛的异步或者复杂网页的数处理方式,而且也提供了java/python/js等三种语言的sdk,同时也提供了selenium grid等解决方案,还很贴心提供了docker解决方案。

2、puppeteer

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless)Chrome or Chromium.

其实在没有puppeteer之前,在*uix环境上搭建一个selenium的环境还是很麻烦,因为需要显卡驱动等,但是puppeteer本来就作为一个non-headless(无头浏览器)解决方案,一切那么顺利成章,而且puppeteer作为后起之新秀,自然是革命家,比如在此之前nodejs的解决方案是phantomjs/CasperJS等,但自从谷歌官方出了puppeteer出现之后,phantomjs作者官宣停止开发了,所以大家在选择nodejs作为自动化和爬虫解决方案自然是知道该如何抉择了,这里不得不提下,虽然这也会吃掉selenium的一部分市场,毕竟相较在api的丰富程度和性能上selenium还是有所单板的,但就语言支持度和稳定性以及存量市场上等生态上selenium还是我的第一选择。

介绍完了web自动化测试和异步网页(也能处理同步)的两个top级框架和解决方案,下面来讲讲app的自动化测试和抓取解决方案

1、appium

Appium is an open source test automation framework for use with native, hybrid and mobile web apps. It drives iOS, Android, and Windows apps using the WebDriver protocol.

2、macaca
Automation test solution for native, hybrid, mobile web and web application on mobile and desktop platforms.多端自动化测试解决方案

因为以上两个解决方案,从产品定位到技术实现基本差不多,我就不单独一一介绍了,分别使用android adb 远程命令行 + ios driver等作为基本底层解决方案,只是使用nodejs 提供了上层的api,大家如果要尝试,我还是建议使用appium来动手实践一下,说了这么多,抛开自动化测试,回归到爬虫上,似乎忘记交代了一个背景,既然有以上那么多数据采集框架,为什么还要用app这种采集方式,如此繁琐麻烦,比如微信数据采集,作为一个基于app的封闭式的数据区域,你必须采用这种非常手段。

分别讲完了异步web页面和app的自动化与数据采集方案,再延伸讲一下,比如云端群控,微信机器人,rpa机器人等自动化领域也基本使用了相同的技术栈,这里我分别使用相关案例和大家介绍下,让大家有个基本的概念:

1、wechaty

作为一个hook微信协议,并采用typescript开发的微信机器人框架,并实现了web/ipad等不同平台的微信群管理,自动对话等功能。

2、openstf

本身作为一个云端真机的自动化管理和测试平台,但也可以实现目前大家所熟知的云端群控系统。

3、rpa的商业版本的最佳范例

比如阿里巴巴的码栈,作为阿里官方出品的一个服务淘宝商家的商业机器人产品,在其它行业也有很大的复制可能性。

聊到这里,关于由爬虫技术衍生的技术内容基本讲完了,外行看热闹,内行看门道,以上三篇作为网络数据采集的漫谈篇,基本上也讲完了,其实对于以爬虫技术作为翘板,有很多可以想象的商业化的空间和生财之道,就看大家是否要做这有意为之的有心人了,从下篇开始,讲为详细介绍各种爬虫的技术实现细节和设计,并附上业界最有实战意义的案例源码讲解。

5、企业级分布式爬虫架构实践

假设目前我们的一个客户需要这样的一个数据采集系统:

  • 1)、采集数据包含不带身份认证的天猫商品列表页面,包含带身份(需要登录)的后端页面数据,数据覆盖京东,天猫,苏宁等。
  • 2)、采集系统需要有快速的可编程能力的界面,帮助他们能够快速调试,纠错,而无需走完一个完整本地开发,测试,发布的流程。
  • 3)、采集系统需要有完整的抓取运行日志,采集数据统计,爬虫异常原因诊断分析,容错重试等。
  • 4)、爬虫任务需要有灵活的参数配置,丰富的时间调度设置,任务粒度切割功能。
  • 5)、爬虫需要有针对业务灵活的并发控制,频率设置,支持多机分布式执行。
  • 6)、爬虫数据支持多种存储方式,比如oss对象存储做离线分析,rds存储做实时分析等。

bala bala,反正客户提出的需求,不管是合理,还是无理,不管是好做,还是不好做,,绝对不会让你好受;
注:以上是笔者接触到一个真实的客户对于数据采集系统的各种要求,笔者在倍受客户厚待的toB创业公司。
如果你接触到客户提出这么多的要求,你会怎么做,下面我给出我的解决方案,为了避免重复造轮子,我们可以从目前已知的开源技术里去找找看,相信读过我前面漫谈篇的同学肯定猜到了我接下来要说什么了,是的,今天就是要和大家说说如何利用scrapy+scrapyd+celery[django apscheduler]来完成以上的功能的架构和实践。

这里不得不提,我心目中开发爬虫,或者更准确来讲,频繁变更的数据抓取脚本型语言一定是最合适,比如python/nodejs,所以在语言和框架选择上非python莫属了

既然要求分布式,易部署,而且需要可视化管理界面,那么从工程组织上讲,主要分为两块,admin与engine,其中admin又因为前后端分离,接口部分和页面部分,接口部分当然是采用django了,页面部分采用react也是很好的选择,engine作为脚本执行容器,本来是准备用golang来写的,但考虑到技术栈的统一,scrapyd正好弥补了这个缺口。

客户还要求爬虫任务调度的功能,且考虑到分布式,而celery作为python语言家族最好的分布式任务框架,自然是最佳选择,但整体评估下来,celery毕竟比较重,又依赖了redis和rabbitMQ,同时在调度表达式上还是不够灵活,遂改为django+apscheduler,小巧,灵活,同时技术栈上也比较统一,容易驾驭。

网友评论

登录后评论
0/500
评论
iamastone
+ 关注