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个站点这个量级的时候,可能你需要编写一个模板生成器,比如 Kimono : Turn websites into structured APIs from your browser in seconds
当你面临的是 1w 个站点以上,但是是同一类型的站点,可能你需要自动模板挖掘。
在这个阶段,算法更重要,所以代码编写的便利程度决定你的选择。当然,当算法稳定之后,就变成下面那个问题了。

当你面临的是每天几十亿的网页,来一次全量计算算一周,每个页面需要提取标题,主图,发布时间,网页分块,页面价值。不可能有人给他们写“脚本”,配模板。大量的建树,分词,机器学习,打分,follow 链接质量预测,筛选。占用大量的计算。
这个阶段,计算速度就非常重要了,除非你能说服老大,给你加几千台机器。相对于这样的需求,重新编写所有基础组件都可以。语言的选择就会选择执行速度快的了。

需要说明的一点是,灵活度,或者说抽取准确性,从上到下是依次递减的。PM也不会要求你能对几百亿的网站准确抽取每个字段对吧。

最后说一下抓取的问题。调度抓取对于每个爬虫都是必要的,但却没什么好说的,不同量级自然有不同的做法,但是这样的系统一般目的明确,少包依赖,不需要你不断修改。并且在架构中,往往可以是独立组件,和下游是不同语言都行,爱用什么写用什么写。。
对于机房带宽来说,下行基本是没人用的,只要你和对方网站愿意,抓取速度不是瓶颈。反而,计算对方压力,筛选重复,高质链接更重要。而这又反过来带来了计算的压力。


  • 11
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值