爬虫项目常见问题及解决方案

来源:互联网 发布:中国 英国 知乎 编辑:程序博客网 时间:2024/04/30 01:02

最近在做一个采集国内的视频网站内容的爬虫项目,在开发的过程中遇到了一些典型问题,在这里罗列下来和大家一起分享:

问题一:用什么语言写爬虫最好?

关于这个问题,我无法给出正确的答案,我最终选择的是Node.js.原因如下:
1.我们团队对Java,Python,Node.JS都比较熟悉,但因为采集数据不少都是JSON接口,我们选择了和JSON最融洽的Node.JS.

2.Node.JS不是天然的多线程或协程的解决方案,采集的效率不高?这里我是这么理解的,Node.JS是天生的异步编程模型,我们的采集最大多数的时间还是用在网络上,在这段时间可以同时发起多个HTTP请求,并等待最终的结果,CPU利用率并不需要太高,所以这一点来看,Node.JS并没有什么劣势。

3.Java,Python都有完善的爬虫框架,为什么不用?我们这个项目算是定向采集,非广度优先,我们梳理完需求,发现我们最基础的需求,只是 能使用代理,能重试连接,能设置超时,能处理异常,而这些问题在Node.JS里,requestretry这个库都已能解决,所以我们并不需要一个大而全的框架,处理队列,分布式等问题,选一个最熟悉的能用的才是最合适的



问题二:用什么数据库最好?

我们最终选择的是MongoDB,但这不是最好的选择

1.为什么抛弃Mysql之类的关系型数据库?
爬虫的结果五花八门,但我们后期要对数据进行清洗,需要更为可视化的数据结构,MongoDB之类的Document型数据库会更加易用。同时,因为项目的需求后期可能会变更,我们会把原始数据尽可能完整的保存起来,以供后面的需求,MongoDB强大的文档查询能力,可以为后期的清洗省很多事


2.为什么不用elasticsearch,Hadoop?

elasticsearch看起来是个不错的选择,它是一个具备很强内容检索能力的搜索方案,后期,我们可以很方便的为视频的内容打标签。但它对我们来说太重了一些,我们并没有用到它的30%的功能

Hadoop也是这几年很牛很火的大数据存储和检索的解决方案。同样的,它依然太重了,对我们来说。

我们每天入库700万条记录,这个其实压根算不上大数据,杀鸡何必用牛刀,而且elasticsearch,Hadoop如果不做集群,就让自已都产生内疚“这么牛的东西,你只单机跑,丢人不”?所以我们只用了MongoDB,做主备就结束了,因为清洗完的数据,已被移走了。


3.MongoDB为什么不是最好的选择?

众所周知,MongoDB是内存映射型的文档数据库,一般意义上理解就是“吃内存”。我们采集来的原始数据,也会被映射到内存中,这是很浪费的,因为我们只需要当天夜里清洗完之后就不再需要这些原始数据。而随着采集的数据不断增加,内存占用会越来越高。我们正在计划往LevelDB迁移。LevelDB是基本Google的BigTable发展出来的硬盘型数据库,对于内存的利用会更高效一些,虽然它的查询能力并不如MongoDB,但我们毕竟不是实时型的应用。




问题三:爬虫代理

不少的平台都有反爬虫的方案,无非是限制帐号访问次数或限制ip的访问频次,后者居多。

最开始的时候,我们选择了网上的收费http代理,百度搜了一个叫全网代理IP的平台,网址是http://www.goubanjia.com/,但实际使用中,可以说非常的垃圾。提供100个http代理,只有3,5个能用的,而且速度很慢,同时它们网站访问慢如龟速,客服态度也不行,只要在群里反馈就直接踢人。后来,换了一家叫快代理的,速度并没有好多少。结论:“网上买http代理绝对不是爬虫代理的好方案”。

最后我们找到了解决办法:

现在许多云主机服务商,都有弹性IP的功能,就是说,你可以申请N多个IP,一个月只需要基本使用费20多块钱,在爬虫过程中,用云平台的接口,换ip去采集,高速稳定。



1 0
原创粉丝点击