Java、Python、C++等各种语⾔写爬⾍
#之所以会想起这个问题,是和室友聊到了爬⾍,他习惯Java,⽽我习惯Python,所以我就想仔细了解⼀下这两者到底有什么区别,并且查了许多资料,参考的⽂章都会在⽂中穿插标注,不敢说很全⾯,只是尽⼒从各种⾓度去理解
⾸先要提醒⾃⼰⼀点,千万别以为只有Python/Java可以写爬⾍,或者⼀提到爬⾍想到的只有Python,实际上现在可以写爬⾍的语⾔⾮常多,⽐如c++、python、erlang、scala、go、js、PHP、Java、Nodejs、、在写这篇博⽂之前我⾃⼰都还不知道这么多,毕竟并不是爬⾍⼯程师,只是偶尔闲来⽆事的时候写⼀点⾃⼰的爬⾍⼩⼯具
查资料的时候发现⼀个很正确的屁话:
废话么不是,⼈家问问题就是想了解不同的语⾔有哪些⽀持和不⽀持,以及这些⽀持和不⽀持的意义是什么,所以才会有语⾔在爬⾍⽅⾯的⽐较,这样的回答嫌疑严重实际没什么墨⽔。
什么适合⾃⼰就⽤什么、什么擅长⽤什么。
这样的回答⽆可厚⾮,对于纯兴趣的⼈这样的鸡汤回答或许可以糊弄⼀下,但是能关注到这个问题的⼈,⼤多都是稍微有点点爬⾍经验的。如果是在实际做项⽬的时候或者像我⼀样想仔细了解⼀下相关区别的,看到这样的回答,⼼⾥默念mmp,
⾔归正传
初级版本的理解:
对于⼀般的信息采集需要,各种语⾔差别不⼤。
C++
运⾏效率和性能⼏乎最强,但是学习成本很⾼,代码成型⽐较慢。
能⽤C/C++做爬⾍,只能说是能⼒的表现,但是不是正确的选择。
Java
⽹络爬⾍⽣态圈也很完善,是Python爬⾍最⼤的对⼿。但是Java语⾔本⾝很笨重,代码量很⼤。
重构成本⽐较⾼,任何修改都会导致代码的⼤量变动。爬⾍经常需要修改部分采集代码。
看来Java的繁琐在爬⾍圈⾥也被⼴泛诟病啊
许多⼈(可别扣字眼,我说的是许多⼈,不是⼤部分,更不是所有⼈)写爬⾍还是更倾向于脚本语⾔,特别是处于兴趣爱好/初学者,因为就⼩规模开发⽽⾔Python要Java便捷太多,C++就更不⽤说了。对于⼤型的项⽬Java会是Python的强有⼒竞争对⼿。
PHP
虽然是世界上最好的语⾔,但是他天⽣不是⼲这个的,
⽽且对多线程、异步⽀持不够好(应该是有⽀持的,PHP有Pthreads多线程扩展的,只是出来的太晚,虽然现在有了,但是爬⾍的⽤户已经被Python和Java占据了⼤部分,所以不会是爬⾍的⾸选),并发处理能⼒很弱。
或许PHP的语⾔随意性可以让⼈更多地把精⼒放在要做的事情上,但是毕竟爬⾍
Python
语法优美、代码简洁、开发效率⾼、⽀持的模块多,相关的HTTP请求模块和HTML解析模块⾮常丰富。
还有强⼤的爬⾍Scrapy,以及成熟⾼效的 scrapy-redis分布式策略
各种爬⾍框架,轮⼦众多,不需⾃⼰造轮⼦,⽅便⾼效的下载⽹页;
多线程、进程模型成熟稳定,爬⾍是⼀个典型的多任务处理场景,请求页⾯时会有较长的延迟,总体来说更多的是等待。多线程或进程会更优化程序效率,提升整个系统下载和分析能⼒。
⽽且,调⽤其他接⼝也⾮常⽅便(胶⽔语⾔)
缺点在于对编码的处理
⽐较⾼级点的理解
(知乎原回答链接,建议⼤家看⼀下这个链接下的⽐较长的⼏个答主的回答,像是专业的爬⾍⼯作者的总结,当然不代表我个⼈的观点,我只是总结出来供⾃⼰的我的读者参考)
//
⾸先取决于⽬的
如果是⼀个站点,单⼀⽬的,⽤习惯的语⾔写吧,学别的语⾔⽤的时间都够重构两遍的了。
如果是有100左右的站点,做个框架,把你的爬⾍管理起来,⽐起怎么写更重要。
ok,以上两个都是 “⼿动” 写模板的(当然,我们会有⼀些⼩插件等辅助⼯具)。⼿动写模板的好处是:当站点不多的时候——快,灵活。在这样的场景和⽬的下,选择你习惯的语⾔,有最多页⾯解析和 HTTP 请求⽀持的库的语⾔最好。⽐如 python,java。
注意,这么选择的唯⼀原因是启动成本⾼于编写成本
当你⾯临的是1000个站点这个量级的时候,可能你需要编写⼀个模板⽣成器,⽐如
java调用python模型当你⾯临的是 1w 个站点以上,但是是同⼀类型的站点,可能你需要⾃动模板挖掘。
在这个阶段,算法更重要,所以代码编写的便利程度决定你的选择。当然,当算法稳定之后,就变成下⾯那个问题了。
当你⾯临的是每天⼏⼗亿的⽹页,来⼀次全量计算算⼀周,每个页⾯需要提取标题,主图,发布时间,⽹页分块,页⾯价值。不可能有⼈给他们写“脚本”,配模板。⼤量的建树,分词,机器学习,打分,follow 链接质量预测,筛选。占⽤⼤量的计算。
这个阶段,计算速度就⾮常重要了,除⾮你能说服⽼⼤,给你加⼏千台机器。相对于这样的需求,重新编写所有基础组件都可以。语⾔的选择就会选择执⾏速度快的了。
需要说明的⼀点是,灵活度,或者说抽取准确性,从上到下是依次递减的。PM也不会要求你能对⼏百亿的⽹站准确抽取每个字段对吧。
最后说⼀下抓取的问题。调度抓取对于每个爬⾍都是必要的,但却没什么好说的,不同量级⾃然有不同的做法,但是这样的系统⼀般⽬的明确,少包依赖,不需要你不断修改。并且在架构中,往往可以是独⽴组件,和下游是不同语⾔都⾏,爱⽤什么写⽤什么写。。
对于机房带宽来说,下⾏基本是没⼈⽤的,只要你和对⽅⽹站愿意,抓取速度不是瓶颈。反⽽,计算对⽅压⼒,筛选重复,⾼质链接更重要。⽽这⼜反过来带来了计算的压⼒。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论