Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4584371
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: 网络与安全

2012-08-02 21:35:11

文章来源:http://www.yakergong.net/blog/archives/507

这是接着之前的()写的,上一篇里主要是写了一些解决性能问题的思路。时间过去快半年了,我们抓取的页面也不止百万了。我们在爬虫上也做了一些小改进,比如改善了链接提取器,(一)里提到的四个问题也都有不同程度的改进,但是还是有一些问题迟迟没能解决。

scrapy的问题

爬虫是一个很依赖于网络io的应用,单机的处理能力有限,很快就变成瓶颈。而scrapy并不是一个分布式的设计,在需要大规模爬取的情况下就很成问题。当然可以通过修改Request队列来实现分布式爬取,而且工作量也不算特别大。

scrapy的并行度不高。力图在爬虫里做一些计算性的操作就会影响抓取的速率。这主要是python里的线程机制造成的,因为Python使用了(和Ruby一样),多线程并不会带来太多速度上的提升(除非用Python的C扩展实现自己的模块,这样绕过了GIL)。Summary:Use Python threads if you need to run IO operations in parallel. Do not if you need to run computations in parallel.

scrapy的内存消耗很快。可能是出于性能方面的考虑,pending requests并不是序列化存储在硬盘中,而是放在内存中的(毕竟IO很费时),而且所有Request都放在内存中。你抓取到 百万网页的时候,考虑到单个网页时产生很多链接的,pending request很可能就近千万了,加上脚本语言里的对象本来就有额外成本,再考虑到GC不会立即释放内存,内存占用就相当可观了。这个问题对我们的应用倒 也没造成多大困扰,找台二三十G内存的机器就能满足很长时间的需求。

memory应该是脚本语言的硬伤,单机程序来说就更受限了。我记得豆瓣的网站就是用python写的,框架好像用得就是quixote。 Davies说内存超过一定量就由master kill掉,再重新fork。持续运行的python程序消耗内存很快,内存泄露也很难调试。

归根到底,这两个问题是根植于语言之中的。

关于如何修改scrapy

前些日子跟几个做爬虫的朋友在五道口 交流了一些scrapy的使用经验。谈点建议吧,如果你想修改scrapy适应自己的需求的话,可以先看看文 档,能否通过修改配置解决(比如宽度优先/深度优先,限制爬取深度这些都可以通过修改配置解决的)。再contrib和contrib_exp两个目录下 有没有实现好的模块,然后再去scrapy snippets看看。如果都不能解决,就去scrapy的google group里问一下,有些实现了的模块并未写在文档中,比如DNS Cache。真的需要自己动手实现了,再查scrapy的在线文档,写的还是挺详细的,关于架构和一些关键的数据结构以及一些常用设置都有说明,有搜索功 能(sphinx生成的)。

列举scrapy的google group里经常有人提出的一些需求:

javascript爬取/ajax爬取(跟js的复杂程度正相关,对于复杂的js通用的解决方案应该就是内置js执行引擎)
让爬虫运行在单独线程(see ““,考虑到Python的多线程机制,这样不太可能有多大的性能提升)
同时运行多个爬虫(新版的scrapy本身就支持这一特性)
防止被网站封禁(不影响人家服务器正常工作是你的义务…自己控制下爬取速率吧)
把Request存储到disk或者database上(pluskid同学讲过)

P.S. 推荐

《》

非常好的关于搜索引擎的书,基本原理讲解得全面,也涉及到足够多的细节。相对市面上介绍nutch的书籍而言,它对基本原理的讲解更细节,对自己动 手实现一个简单的搜索引擎更 有帮助。比如它会讲如何提取链接,如何对网页消重,甚至讲了一个简单的中文最大正向匹配分词算法。也像douban里的评论里所说,阅读它需要点IR 方面的基础,有些知识它觉得理所当然就一笔带过了。还是有国内教材的作风,重在罗列,不以读者理解为目的。一些不好理解的地方没有做过多阐述。P.S. 我觉得nutch里的爬虫本来就实现得很粗糙。


阅读(2403) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~