Javascript 高效网络爬虫的语言推荐

Javascript 高效网络爬虫的语言推荐,javascript,asynchronous,node.js,web-crawler,Javascript,Asynchronous,Node.js,Web Crawler,我正在寻找一种语言来编写一个高效的网络爬虫。我珍视的东西: 富于表现力的语言(不要让我只通过静态输入框) 有用的库(基于css选择器的html解析器会更好) 最小内存占用 可靠的语言运行库 我试过node.js。理论上我喜欢节点。Javascript非常有表现力。您可以使用jQuery解析html。节点的异步特性允许我并行抓取多个URL,而无需处理线程。V8解析起来又好又快 实际上,node并不适合我。我的过程经常崩溃。总线错误,事件管理器中的异常。。。等等 我已经做了相当多的Ruby开发,

我正在寻找一种语言来编写一个高效的网络爬虫。我珍视的东西:

  • 富于表现力的语言(不要让我只通过静态输入框)
  • 有用的库(基于css选择器的html解析器会更好)
  • 最小内存占用
  • 可靠的语言运行库
我试过node.js。理论上我喜欢节点。Javascript非常有表现力。您可以使用jQuery解析html。节点的异步特性允许我并行抓取多个URL,而无需处理线程。V8解析起来又好又快

实际上,node并不适合我。我的过程经常崩溃。总线错误,事件管理器中的异常。。。等等

我已经做了相当多的Ruby开发,所以我不介意使用Ruby 1.9的协程(fibers?),只要我不会在VM/库稳定性方面遇到类似的问题


其他建议?

我很确定任何语言都有可以处理它的内置功能。您确定node.js没有因为代码中的问题而崩溃吗?如果你喜欢Ruby,为什么不使用它呢


也有(Python),如果你的主要障碍是HTML解析,你可能会考虑。

使用NoDE.js,并修复破坏它的任何东西。它已经在我的Ubuntu设备上运行了好几个月,没有任何问题

对于这个库,我建议使用YUI3而不是jQuery,它可以让你轻松地在几分钟内构建一个webcrawler/scraper,如果你不相信我在YUIConf2010上观看的话,它只需要40分钟,但它都是关于代码的

Dav Glass在展示它有多么简单以及您需要的代码有多么少方面做得很好,是的,在演讲中不同版本的jsdom出现了一些问题,但是演讲是在11月初进行的,所以大部分问题应该已经解决了

您可以在他的网站上查看演讲中的所有内容。
这是他从Digg那里得到的最新新闻标题


说真的,让Node.js在您的系统上运行是非常值得的,因为最终您在服务器端获得了YUI3的所有优点。

使用您最熟悉的语言或您最想学习的语言。您可以用任何语言编写网络爬虫

我个人用Java、Ruby和Perl开发了爬虫程序。所有这些语言都符合您的要求。(是的,甚至Java中的爬虫程序也有合理的内存占用。)其中,Java是我最喜欢的,因为它拥有最成熟的HTTP和HTML库。如果我发现自己正在写另一篇文章,我想接下来试试Python


您将面临的第一个算法问题是如何有效地识别您已经访问过的页面。这个URL索引可能会变得非常大,并且必须支持快速查找和插入。一个通用的数据库索引将在早期的爬虫原型中工作,但很快就会成为瓶颈。

python和BeautifulSoup,易学且非常有效。

我刚刚发现另一个问题。jsdom的jQuerify方法大约有80%的时间没有执行回调。似乎没有执行添加的脚本元素的onload回调。这似乎很奇怪,我必须模拟一个浏览器环境,完成脚本加载来执行html抓取。我同意。要知道你是否有适合这份工作的锤子,唯一的办法就是你是否确切地知道你所拥有的锤子不起作用的原因。首先修复此问题。@richcollins不需要加载脚本,事实上,到目前为止,没有任何框架执行页面的JS。现在它所做的只是在浏览器中提供与YUI3完全相同的API。就互操作性而言,这是一流的。另外,我不认为这会在任何方面成为性能问题。例如,我过去使用过Beautiful soup,老实说,我无法想象有什么比这更慢的了:/YUI看起来可以作为npm模块安装。jsdom+jQuery方法实际上向文档添加了一个脚本标记,加载它,然后执行回调来告诉您它已加载。我宁愿使用jQuery,因为我(以及后续开发人员)熟悉它的API,但如果YUI导致的问题更少,我很乐意使用它。感谢您的建议YUI+jsdom正在疯狂地泄漏内存:-(我确信崩溃不是由我的代码中的问题引起的。更可能是我的代码在节点中暴露了问题。特别是在总线错误的情况下。我喜欢Ruby,我只是没有任何用Ruby编写异步代码的经验,所以我不知道这是否“容易”正如在节点中一样。我将使用我的db(tokyocabinet)来跟踪爬网状态。如果需要,我可以使用memcache进行扩展,但只要我可以在内存中安装TC db,就不需要memcache。