全⽹最全⽹络数据采集(爬⾍)指南本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语⾔开发的同学不服,但是nod
ejs才是爬⾍的亲兄弟啊,⽐较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
官⽹:,它作为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、⼋⽖鱼
android实现底部导航栏作为深圳的⼀家爬⾍技术公司,和神箭⼿的定位还是有所差异,毕竟从产品设计上来看,神箭⼿更偏互联⽹化,⽽⼋⽖鱼更像是在提供⼀个⼯具,⾯向B端客户,更保守⼀点,同时也提供了可视化客户端帮助爬⾍⼩⽩快速⼊⼿,也提供了⼀些⾏业解决⽅案,尽管它也提供了saas 收费模式。
7、造数
从官⽹和产品设计风格来看,该公司主打的是可视化爬⾍和互联⽹玩法,但不得不说,产品功能稍显粗糙,且对于爬⾍的理解不是⾮常深刻,有可能是我了解的⽐较⽚⾯吧。
以上也分析了国内国外7家爬⾍产品,基本内核就是将web的⾮结构化数据结构化的⼯程,只是说使⽤
的技术和产品表达形式有差异⽽已,不管你是⽤⼈⼯智能深度学习,亦或是⽆监督的机器学习算法,还是使⽤简单粗暴的⽅式,解决的只是规模化和⼈⼒成本问题,但愿这些对你有所启发,到此产品竞品篇以结束,也许还很浅薄,但愿后⾯还能有时间精⼒把这些竞品分析得更彻底完整⼀点吧。
最后也谈下我对国内外做此类产品的⼀点差异吧,国外确实⽐国内要⾼不少,同时⼤家也能看出来纯粹地做爬⾍技术平台,没有特别⼤的公司,或者直接说不值钱,⽽以爬⾍技术作为基座,上⾯做出解决问题的应⽤或者产品才能做⼤做强,在某些时候这或许就是技术或者技术⼈的悲哀吧。
爬虫软件 app4、爬⾍相关技术延伸与拓展
前⾯漫谈了⽹络数据采集系统的使⽤场景,价值,以及不同语⾔开源框架技术实现选型,以及国内外商业化爬⾍产品的竞品分析,本章继续沿着这个⽅向和⼤家讲讲爬⾍所涉及到的技术除了能够采集⽹络数据,还能做什么,包括前⾯也有提到,所谓的爬⾍主要泛指web数据采集,其实还有⼀个⽅向就是app数据采集,⽹络数据采集的技术⽅案,除了能够采集数据以外,与此⼀脉相承的还有就是页⾯⾃动化测试,再就是app真机云端⾃动化测试等领域;
关于web⽅向做⾃动化测试我这⾥提出两个常规且使⽤⼴泛的框架:
1、selenium
address用法及固定搭配
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-headle
ss)Chrome or Chromium.
其实在没有puppeteer之前,在*uix环境上搭建⼀个selenium的环境还是很⿇烦,因为需要显卡驱动等,但是puppeteer本来就作为⼀个non-headless(⽆头浏览器)解决⽅案,⼀切那么顺利成章,⽽且puppeteer作为后起之新秀,⾃然是⾰命家,⽐如在此之前nodejs的解决⽅案是phantomjs/CasperJS等,但⾃从⾕歌官⽅出了puppeteer出现之后,phantomjs作者官宣停⽌开发了,所以⼤家在选择nodejs作为⾃动化和爬⾍解决⽅案⾃然是知道该如何抉择了,这⾥不得不提下,虽然这也会吃掉selenium的⼀部分市场,毕竟相较在api的丰富程度和性能上selenium还是有所单板的,但就语⾔⽀持度和稳定性以及存量市场上等⽣态上selenium还是我的第⼀选择。
vb个人信息的编程代码介绍完了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机器⼈等⾃动化领域也基本使⽤了相同的技术栈,这⾥我分别使⽤相关案例和⼤家介绍下,让⼤家有个基本的概念:
html网站制作答辩问题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,⼩巧,灵活,同时技术栈上也⽐较统⼀,容易驾驭。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论