首页
技术笔记
网址导航
Json在线解析
二维码
Ip地址查询
在线流程图
新用户注册
|
会员登录
在线工具
开发笔记
毒鸡汤
网址导航
免费在线流程图
10赞
684
当前位置:
开发笔记
>
编程语言
> 正文
各种语言写网络爬虫有什么优点缺点?
作者:mobiledu2402852357 | 2021-09-01 18:57
现在好像很多人在用python但也看到了PHP,JAVA,C++等等。本人以上各种语言省慬皮毛。该用那种语言开发爬虫呢?
现在好像很多人在用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语言实现呢?
推荐阅读
程序员
如何读取用R加密的.xls文件?
如何解决《如何读取用R加密的.xls文件?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
我在哪里可以找到Box API的企业ID?
如何解决《我在哪里可以找到BoxAPI的企业ID?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
如何在ExtJS中的绑定公式中使用逻辑运算符?
如何解决《如何在ExtJS中的绑定公式中使用逻辑运算符?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
如何将向量元素作为参数传递给可变参数模板函数?
如何解决《如何将向量元素作为参数传递给可变参数模板函数?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
对子组件执行方法
如何解决《对子组件执行方法》经验,为你挑选了1个好方法。 ...
[详细]
程序员
以编程方式创建plist文件而不从主bundle中复制plist
如何解决《以编程方式创建plist文件而不从主bundle中复制plist》经验,为你挑选了1个好方法。 ...
[详细]
程序员
我正在尝试从c中的文件读取一行并动态分配内存,但结果总是很糟糕
如何解决《我正在尝试从c中的文件读取一行并动态分配内存,但结果总是很糟糕》经验,为你挑选了1个好方法。 ...
[详细]
程序员
必须指定Spring Security authenticationmanager - 用于自定义筛选器
如何解决《必须指定SpringSecurityauthenticationmanager-用于自定义筛选器》经验,为你挑选了2个好方法。 ...
[详细]
程序员
是否可以在Java AutoValue中为集合添加值?
如何解决《是否可以在JavaAutoValue中为集合添加值?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
变异函数 - 是否存在参数限制?
如何解决《变异函数-是否存在参数限制?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
Summernote OnImageUpload未被执行
如何解决《SummernoteOnImageUpload未被执行》经验,为你挑选了1个好方法。 ...
[详细]
程序员
委托刷新令牌获取新JWT的基本策略
如何解决《委托刷新令牌获取新JWT的基本策略》经验,为你挑选了0个好方法。 ...
[详细]
程序员
R Shiny Dashboard Infobox超过两行
如何解决《RShinyDashboardInfobox超过两行》经验,为你挑选了1个好方法。 ...
[详细]
程序员
C - write()系统调用打印乱码而不是pid_t
如何解决《C-write()系统调用打印乱码而不是pid_t》经验,为你挑选了1个好方法。 ...
[详细]
程序员
使用Universal Class库中的Windows UWP Windows.Devices.SerialCommunication.SerialDevice
如何解决《使用UniversalClass库中的WindowsUWPWindows.Devices.SerialCommunication.SerialDevice》经验,为你挑选了1个好方法。 ...
[详细]
程序员
如何在多个CSV文件中比较,匹配和追加多个值?
如何解决《如何在多个CSV文件中比较,匹配和追加多个值?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
c ++中的银行家算法
如何解决《c++中的银行家算法》经验,为你挑选了1个好方法。 ...
[详细]
程序员
caffe中的准确性问题
如何解决《caffe中的准确性问题》经验,为你挑选了1个好方法。 ...
[详细]
程序员
Perf显示损坏的函数名称
如何解决《Perf显示损坏的函数名称》经验,为你挑选了1个好方法。 ...
[详细]
程序员
在现代处理器中是否有128位整数的硬件支持?
如何解决《在现代处理器中是否有128位整数的硬件支持?》经验,为你挑选了2个好方法。 ...
[详细]
吐了个 "CAO" !
吐个槽吧,看都看了
会员登录
|
用户注册
mobiledu2402852357
这个屌丝很懒,什么也没留下!
关注作者
Tags | 热门标签
actionscrip
bash
c#
c++
c语言
erlang
flutter
go
golang
java
javascript
lua
node.js
perl
php
python
scala
typescript
RankList | 热门文章
1
Django Admin不保存预先填充的内联字段,这些字段保留在初始状态
2
如何根据Angular js中的两个自定义过滤器过滤数据
3
在PyCharm中运行或调试时增加输出缓冲区
4
有条件地阻止方法覆盖
5
qDebug()不会打印任何内容
6
Android 6.0.1无法以编程方式启用wifi热点
7
将null值赋给list中的属性
8
电报,获取现有贴纸的file_id
9
不遵守输入字段的Maxlength属性
10
Angular2中的拦截器
11
SyntaxError:Object.parse(native)上的意外标记u JSON.parse()的NodeJS
12
如何使用CSS引导类从HTML生成PDF
13
在Logstash中解析JSON消息
14
将JSON字符串粘贴到Visual Studio中
15
从data.frame或data.table构建一个方形邻接矩阵
16
大文件和散列 - 性能问题
17
在RHEL中将Cassandra从2.2升级到3.0
18
如何设置数据表中的总页数
19
调整下降区域的气泡破坏
20
MySql TIMESTAMP列是自动更新的。为什么?
DevBox开发工具箱 | 专业的在线开发工具网站
京公网安备 11010802040832号
|
京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有