使用Scala进行网络爬虫

39

想知道是否有一种利用Scala简洁语法的网络爬虫库。目前,我已经找到Chafe,但这个库文档不完善且维护状况不佳。我想知道是否有人使用Scala进行爬取并提供建议。(我试图将其集成到现有的Scala框架中,而不是使用Python等语言编写的爬虫工具。)


对我来说比较有用的爬虫库是httpunit和htmlunit。但它们都是Java库,而不是显式的Scala库。 - Niklas Rosencrantz
1
面对类似的挑战,我发现这个Scala HTML库非常有用。虽然它有点陈旧,但是对我来说仍然解决了问题。我使用 SBT 构建将其包装起来 here。希望能帮到你。 - Steven Levine
只是想通知大家,我已经编写了一个升级版的Jsoup:https://github.com/filosganga/ssoup - Filippo De Luca
1
我编写了一个DSL来构建抓取Akka actor系统,它在底层使用JSoup和spray-client。提供的DSL操作不可变上下文(受spray-routing启发),可以在此处找到:https://github.com/bfil/scalescrape - BFil
1
我非常喜欢这篇文章,它展示了如何使用akka进行爬取:http://foat.me/articles/crawling-with-akka/ - Jordan Stewart
3个回答

14

首先,在JVM中有大量的HTML抓取库,你只需要使用其中一个(我的库做个修改即可)。

我用过的四个库是:

我用过Selenium,但从未用于抓取数据。 Scala有一个Selenium包装器

我建议对现有的Java库进行修改,而不是使用某些不成熟的Scala库。


2
“半熟的Scala”可能比“(过度)烤熟的Java”好两倍。” - Erik Kaplun
如果烤过头了,那当然不好吃啦。谁都不喜欢烤焦的饼干 :) ... 不过,相比之下,你不能从烤过头的饼干中得到沙门氏菌,就像你可以从未烤熟的饼干中得到一样 :) 。无论如何,我仍然认为你不应该有语言偏见,特别是因为Groovy、Scala和Clojure很擅长与现有的Java交互。此外,Java 8已经发布了,所以希望会有更少的烤焦情况发生。 - Adam Gent
现在也有scala-scraper库,它是JSoup的包装器。它提供了相当方便的语法,用于从HTML页面中提取数据。 - Dmitry Vyal

8
我没有Scala特定的建议,但对于JVM总体而言,我在以下方面获得了良好的成功:
  • JSoup - 您可以使用CSS选择器“scrape”文档。非常容易使用。
  • 使用Tagsoup将输入的HTML转换为XML,然后使用XML处理器进行“Scrape”。
由于Scala内置的XML“dsl”相当简洁(如果您可以原谅它的perf问题和偶尔的API怪异),因此Tagsoup路线实际上与Scala非常配合。而且,Tagsoup将处理几乎任何垃圾文档。它还具有许多其他SAX解析器会因未声明的HTML实体而崩溃的内置理解。
简而言之,如果可能,请使用JSoup + CSS选择器;否则,请使用Tagsoup + Scala XML。如果速度慢没关系,则先使用tagsoup,然后使用jsoup处理结果。

请注意,据我上次检查,JSoup与Scala不兼容:https://issues.scala-lang.org/browse/SI-3809 - Adam Gent
@AdamGent 奇怪。我在一个使用scala 2.9.2的项目中成功地使用JSoup 1.7.1。可能是我的使用方式没有触发这个问题(?)。 - overthink
很可能是这样。我们通过艰难的方式发现了这一点,我已经没有代码了。实际上,这是我们停止使用Scala的许多原因之一 :( - Adam Gent
3
看起来JSoup的作者几年前已经解决了Scala的问题:https://github.com/jhy/jsoup/pull/54 - overthink
该死,这提醒了我已经过去了多久。如果我没记错的话,当时甚至还没有发布Scala 2.9。 - Adam Gent

2

我推荐使用Goose:https://github.com/jiminoc/goose

它可能不太适合一般用途,但如果你需要从流行网站抓取文章内容,它可以直接使用。同时,它还提供了一个框架,可以让你扩展代码以覆盖其他网站。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接