各种语言写网络爬虫有什么优点缺点?
程序员文章站
2022-06-17 21:02:11
...
现在好像很多人在用python
但也看到了PHP,JAVA,C++等等。
本人以上各种语言省慬皮毛。
该用那种语言开发爬虫呢?
我用 PHP 和 Python 都写过爬虫和正文提取程序。
最开始使用 PHP 所以先说说 PHP 的优点:
1.语言比较简单,PHP 是非常随意的一种语言。写起来容易让你把精力放在你要做的事情上,而不是各种语法规则等等。
2.各种功能模块齐全,这里分两部分:
1.网页下载:curl 等扩展库;
2.文档解析:dom、xpath、tidy、各种转码工具,可能跟题主的问题不太一样,我的爬虫需要提取正文,所以需要很复杂的文本处理,所以各种方便的文本处理工具是我的大爱。;
总之容易上手。
缺点:
1.并发处理能力较弱:由于当时 PHP 没有线程、进程功能,要想实现并发需要借用多路服用模型,PHP 使用的是 select 模型。实现其来比较麻烦,可能是因为水平问题我的程序经常出现一些错误,导致漏抓。
再说说 Python:
优点:
1.各种爬虫框架,方便高效的下载网页;
2.多线程、进程模型成熟稳定,爬虫是一个典型的多任务处理场景,请求页面时会有较长的延迟,总体来说更多的是等待。多线程或进程会更优化程序效率,提升整个系统下载和分析能力。
3.GAE 的支持,当初写爬虫的时候刚刚有 GAE,而且只支持 Python ,利用 GAE 创建的爬虫几乎免费,最多的时候我有近千个应用实例在工作。
缺点:
1.对不规范 HTML 适应能力差:举个例子,如果一个页面里面同时有 GB18030 字符集的中文和 UTF-8 字符集的中文,Python 处理起来就没有 PHP 那么简单,你自己需要做很多的判断工作。当然这是提取正文时的麻烦。
Java 和 C++ 当时也考察过,相对脚本语言比较麻烦,所以放弃。
总之,如果开发一个小规模的爬虫脚本语言是个各方面比较有优势的语言。如果要开发一个复杂的爬虫系统可能 Java 是个增加选项, C++ 我感觉写个模块之类的更加适合。对于一个爬虫系统来说,下载和内文解析只是基本的两个功能。真正好的系统还包括完善的任务调度、监控、存储、页面数据保存和更新逻辑、排重等等。爬虫是一个耗费带宽的应用,好的设计会节约大量的带宽和服务器资源,并且好坏差距很大。 update:2016-02-12
curl http://www.topit.me/|grep -P "http:[^>]*?(jpg|gif)" -o|xargs wget
这就是一个正则搜索url中以http开头 jpg或gif结尾的字符串,使用wget下载的例子
2015-02-22 原答案:
写过一个爬图片的程序,使用的shell,加到crontab里面
大概是curl | grep | wget 一句话
是不是更简单? 反对 @Kenneth ,他见过的爬虫太少了
首先取决于目的
如果是一个站点,单一目的,用习惯的语言写吧,学别的语言用的时间都够重构两遍的了。
如果是有100左右的站点,做个框架,把你的爬虫管理起来,比起怎么写更重要。
ok,以上两个都是 “手动” 写模板的(当然,我们会有一些小插件等辅助工具)。手动写模板的好处是:当站点不多的时候——快,灵活。在这样的场景和目的下,选择你习惯的语言,有最多页面解析和 HTTP 请求支持的库的语言最好。比如 python,java。
注意,这么选择的唯一原因是启动成本高于编写成本
当你面临的是1000个站点这个量级的时候,可能你需要编写一个模板生成器,比如 Kimono : Turn websites into structured APIs from your browser in seconds
当你面临的是 1w 个站点以上,但是是同一类型的站点,可能你需要自动模板挖掘。
在这个阶段,算法更重要,所以代码编写的便利程度决定你的选择。当然,当算法稳定之后,就变成下面那个问题了。
当你面临的是每天几十亿的网页,来一次全量计算算一周,每个页面需要提取标题,主图,发布时间,网页分块,页面价值。不可能有人给他们写“脚本”,配模板。大量的建树,分词,机器学习,打分,follow 链接质量预测,筛选。占用大量的计算。
这个阶段,计算速度就非常重要了,除非你能说服老大,给你加几千台机器。相对于这样的需求,重新编写所有基础组件都可以。语言的选择就会选择执行速度快的了。
需要说明的一点是,灵活度,或者说抽取准确性,从上到下是依次递减的。PM也不会要求你能对几百亿的网站准确抽取每个字段对吧。
最后说一下抓取的问题。调度抓取对于每个爬虫都是必要的,但却没什么好说的,不同量级自然有不同的做法,但是这样的系统一般目的明确,少包依赖,不需要你不断修改。并且在架构中,往往可以是独立组件,和下游是不同语言都行,爱用什么写用什么写。。
对于机房带宽来说,下行基本是没人用的,只要你和对方网站愿意,抓取速度不是瓶颈。反而,计算对方压力,筛选重复,高质链接更重要。而这又反过来带来了计算的压力。 爬虫这种应用,看的不是单机的代码执行速度,看的是开发效率和工具便捷性。所以语言越简单越好。 就像 @kenneth 所说的。开发效率很重要。因为爬虫的具体代码得根据网站不同而修改的,而Python这种灵活的脚本语言特别适合这种任务。
同时Python还有强大的爬虫库比如Scrapy。 用Java写过,语言笨重,所建立的数据模型的任何修改都会导致代码大量变动,所以有些麻烦。
不过有个项目的一部分底层工具是爬网页,再封装一个业务层出来。业务厚重到这种程度,用Java就很舒服了。 这个要看你的具体业务吧。以前为了一个爬虫任务,被爬的对象全是动态渲染的(某博就是这样丧心病狂),于是就要找一个*面浏览器,经过选择PhantomJS最合适,所以就采用了JavaScript。 没人说下nodejs么?配合cheerio 简单方便,一般简单用用够了。天生异步,爬起来也很快。 python. 爬虫模块最丰富. 用R语言实现呢?
但也看到了PHP,JAVA,C++等等。
本人以上各种语言省慬皮毛。
该用那种语言开发爬虫呢?
回复内容:
谢邀!我用 PHP 和 Python 都写过爬虫和正文提取程序。
最开始使用 PHP 所以先说说 PHP 的优点:
1.语言比较简单,PHP 是非常随意的一种语言。写起来容易让你把精力放在你要做的事情上,而不是各种语法规则等等。
2.各种功能模块齐全,这里分两部分:
1.网页下载:curl 等扩展库;
2.文档解析:dom、xpath、tidy、各种转码工具,可能跟题主的问题不太一样,我的爬虫需要提取正文,所以需要很复杂的文本处理,所以各种方便的文本处理工具是我的大爱。;
总之容易上手。
缺点:
1.并发处理能力较弱:由于当时 PHP 没有线程、进程功能,要想实现并发需要借用多路服用模型,PHP 使用的是 select 模型。实现其来比较麻烦,可能是因为水平问题我的程序经常出现一些错误,导致漏抓。
再说说 Python:
优点:
1.各种爬虫框架,方便高效的下载网页;
2.多线程、进程模型成熟稳定,爬虫是一个典型的多任务处理场景,请求页面时会有较长的延迟,总体来说更多的是等待。多线程或进程会更优化程序效率,提升整个系统下载和分析能力。
3.GAE 的支持,当初写爬虫的时候刚刚有 GAE,而且只支持 Python ,利用 GAE 创建的爬虫几乎免费,最多的时候我有近千个应用实例在工作。
缺点:
1.对不规范 HTML 适应能力差:举个例子,如果一个页面里面同时有 GB18030 字符集的中文和 UTF-8 字符集的中文,Python 处理起来就没有 PHP 那么简单,你自己需要做很多的判断工作。当然这是提取正文时的麻烦。
Java 和 C++ 当时也考察过,相对脚本语言比较麻烦,所以放弃。
总之,如果开发一个小规模的爬虫脚本语言是个各方面比较有优势的语言。如果要开发一个复杂的爬虫系统可能 Java 是个增加选项, C++ 我感觉写个模块之类的更加适合。对于一个爬虫系统来说,下载和内文解析只是基本的两个功能。真正好的系统还包括完善的任务调度、监控、存储、页面数据保存和更新逻辑、排重等等。爬虫是一个耗费带宽的应用,好的设计会节约大量的带宽和服务器资源,并且好坏差距很大。 update:2016-02-12
curl http://www.topit.me/|grep -P "http:[^>]*?(jpg|gif)" -o|xargs wget
这就是一个正则搜索url中以http开头 jpg或gif结尾的字符串,使用wget下载的例子
2015-02-22 原答案:
写过一个爬图片的程序,使用的shell,加到crontab里面
大概是curl | grep | wget 一句话
是不是更简单? 反对 @Kenneth ,他见过的爬虫太少了
首先取决于目的
如果是一个站点,单一目的,用习惯的语言写吧,学别的语言用的时间都够重构两遍的了。
如果是有100左右的站点,做个框架,把你的爬虫管理起来,比起怎么写更重要。
ok,以上两个都是 “手动” 写模板的(当然,我们会有一些小插件等辅助工具)。手动写模板的好处是:当站点不多的时候——快,灵活。在这样的场景和目的下,选择你习惯的语言,有最多页面解析和 HTTP 请求支持的库的语言最好。比如 python,java。
注意,这么选择的唯一原因是启动成本高于编写成本
当你面临的是1000个站点这个量级的时候,可能你需要编写一个模板生成器,比如 Kimono : Turn websites into structured APIs from your browser in seconds
当你面临的是 1w 个站点以上,但是是同一类型的站点,可能你需要自动模板挖掘。
在这个阶段,算法更重要,所以代码编写的便利程度决定你的选择。当然,当算法稳定之后,就变成下面那个问题了。
当你面临的是每天几十亿的网页,来一次全量计算算一周,每个页面需要提取标题,主图,发布时间,网页分块,页面价值。不可能有人给他们写“脚本”,配模板。大量的建树,分词,机器学习,打分,follow 链接质量预测,筛选。占用大量的计算。
这个阶段,计算速度就非常重要了,除非你能说服老大,给你加几千台机器。相对于这样的需求,重新编写所有基础组件都可以。语言的选择就会选择执行速度快的了。
需要说明的一点是,灵活度,或者说抽取准确性,从上到下是依次递减的。PM也不会要求你能对几百亿的网站准确抽取每个字段对吧。
最后说一下抓取的问题。调度抓取对于每个爬虫都是必要的,但却没什么好说的,不同量级自然有不同的做法,但是这样的系统一般目的明确,少包依赖,不需要你不断修改。并且在架构中,往往可以是独立组件,和下游是不同语言都行,爱用什么写用什么写。。
对于机房带宽来说,下行基本是没人用的,只要你和对方网站愿意,抓取速度不是瓶颈。反而,计算对方压力,筛选重复,高质链接更重要。而这又反过来带来了计算的压力。 爬虫这种应用,看的不是单机的代码执行速度,看的是开发效率和工具便捷性。所以语言越简单越好。 就像 @kenneth 所说的。开发效率很重要。因为爬虫的具体代码得根据网站不同而修改的,而Python这种灵活的脚本语言特别适合这种任务。
同时Python还有强大的爬虫库比如Scrapy。 用Java写过,语言笨重,所建立的数据模型的任何修改都会导致代码大量变动,所以有些麻烦。
不过有个项目的一部分底层工具是爬网页,再封装一个业务层出来。业务厚重到这种程度,用Java就很舒服了。 这个要看你的具体业务吧。以前为了一个爬虫任务,被爬的对象全是动态渲染的(某博就是这样丧心病狂),于是就要找一个*面浏览器,经过选择PhantomJS最合适,所以就采用了JavaScript。 没人说下nodejs么?配合cheerio 简单方便,一般简单用用够了。天生异步,爬起来也很快。 python. 爬虫模块最丰富. 用R语言实现呢?