2

我正在制作网络爬虫。我已经尝试过异步 http 客户端,例如 scala tutorial scaling-out-with-scala-and-akka and spray中的客户端,但我无法让它工作。目前性能对我来说不是最重要的部分,但稍后我想在不更改库的情况下轻松提高请求/秒比率。

库应该能够对 http 标头进行操作,并且不应该在解析 dns 时出现性能问题。哪个库应该最适合这项任务?

4

1 回答 1

5

喷雾应该足够了。即使在 16mbit 连接上使用这个非常简单的代码,我也可以每秒搜索大约 8 页,即每天 700,000 页。它获取维基百科主页上的所有链接,加载所有这些页面,然后获取这些页面上的所有链接。问题是维基百科的服务器可能会限制每个客户端的流量,所以如果我一次访问多个站点,我应该会获得更快的速度。它使用并行集合来加速它并通过 dns 解析避免延迟。但是如果你用演员和/或期货正确地写这个,使用像喷雾这样的库,我猜它会更快。

import io.Source

def time[T](f: => T): T = {
  val start = System.nanoTime
  val r = f
  val end = System.nanoTime
  val time = (end - start)/1e6
  println("time = " + time +"ms")
  r
}

val domain = "https://en.wikipedia.org"
val startPage = "/wiki/Main_Page"
val linkRegex = """\"/wiki/[a-zA-Z\-_]+\"""".r


def getLinks(html: String): Set[String] =
  linkRegex.findAllMatchIn(html).map(_.toString.replace("\"", "")).toSet

def getHttp(url: String) = {
  val in = Source.fromURL(domain + url, "utf8")
  val response = in.getLines.mkString
  in.close()
  response
}

val links = getLinks(getHttp(startPage))
links.foreach(println)
println(links.size)

val allLinks = time(links.par.flatMap(link => getLinks(getHttp(link))))
println(allLinks.size)
于 2013-09-28T15:56:42.453 回答