用Scala实现Web抓取

用Scala实现Web抓取,scala,web-scraping,libraries,Scala,Web Scraping,Libraries,只是想知道是否有人知道一个利用Scala简洁语法的web抓取库。到目前为止,我已经发现了,但这似乎缺乏文档记录和维护。我想知道是否有人用Scala做过刮削,并有什么建议。(我正在尝试集成到现有的Scala框架中,而不是使用用Python编写的scraper。)我推荐Goose: 它并不像你需要的那样通用,但如果你从流行网站上抓取文章内容,它可能会开箱即用。如果您想将其代码扩展到其他站点,它还提供了一个框架供您使用。我没有特定于Scala的建议,但对于JVM,我在以下方面取得了良好的成功: 您可

只是想知道是否有人知道一个利用Scala简洁语法的web抓取库。到目前为止,我已经发现了,但这似乎缺乏文档记录和维护。我想知道是否有人用Scala做过刮削,并有什么建议。(我正在尝试集成到现有的Scala框架中,而不是使用用Python编写的scraper。)

我推荐Goose:


它并不像你需要的那样通用,但如果你从流行网站上抓取文章内容,它可能会开箱即用。如果您想将其代码扩展到其他站点,它还提供了一个框架供您使用。

我没有特定于Scala的建议,但对于JVM,我在以下方面取得了良好的成功:

  • 您可以使用CSS选择器“刮取”文档。很高兴和你一起工作
  • 用于将输入的HTML转换为XML,然后使用XML处理器“刮取”
Tagsoup路由实际上可以很好地与Scala配合使用,因为Scala内置的XML“dsl”非常简洁(如果您可以原谅它的性能问题和偶尔出现的API怪异的话)。此外,Tagsoup几乎可以处理您提供给它的任何垃圾文档。它还具有一些细节,比如对许多HTML实体的内置理解,而其他SAXSparser会因为未声明而扼杀这些HTML实体


tl;dr-JSoup+CSS选择器(如果可能),否则为Tagsoup+scala XML。如果slow还可以,那么先标记soup,然后jsoup结果。

首先,JVM中有大量的HTML抓取lib,您需要做的就是

我使用的四种方法是:

  • HtmlUnit-将模拟浏览器,甚至运行Javascript
  • Jericho-保留格式,如果您想要编辑已删除的HTML,则非常理想
  • 内科特米尔
  • JSoup--
我用过硒,但从来没有刮过


我建议用一个现有的Java库来代替一些半生不熟的Scala库。

对我来说比较有效的scraper库是httpunit和htmlunit。但它们是Java库,而不是显式的Scala。它有点老了,但还是帮了我的忙。我用一个SBT构建包住了它。HTHJ必须告知,我已经编写了一个pimped Jsoup:我已经编写了一个DSL来构建Akka演员系统,它在引擎盖下使用Jsoup和spray客户端。DSL提供了一个不可变的上下文(受喷洒路由的启发),它可以在这里找到:我非常喜欢这篇文章,它展示了如何使用akka进行刮取:仅供参考,上次我检查JSoup时,它不适用于Scala:@AdamGent。我在scala 2.9.2项目中成功地使用了JSOUP1.7.1。我使用它可能不会引发问题(?)可能。我们用艰难的方式发现了这一点,我不再有代码了。事实上,不幸的是,这是我们停止使用Scala的众多原因之一:(看起来JSoup的作者在几年前就解决了Scala的问题:该死的,这提醒了我们它有多长时间了。如果我没记错的话,我甚至不认为Scala 2.9在它发生的时候就已经过时了。“半生不熟的Scala”可能是(过度)烤java的两倍。”不过。如果是烤过头了,是的。没有人喜欢烧焦的饼干:)。。。。同样,你不能像从欠烤饼干中一样从过烤饼干中获得沙门氏菌:)。不管怎样,我仍然认为您不应该偏袒语言,特别是因为Groovy、Scala和Clojure擅长与现有Java交互。除此之外,Java8已经面世,所以希望能够减少过度烘焙。现在还有scala scraper库,它是JSoup的包装器。它为从html页面提取数据带来了非常方便的语法。