我正在制作网络爬虫。我已经尝试过异步 http 客户端,例如 scala tutorial scaling-out-with-scala-and-akka and spray中的客户端,但我无法让它工作。目前性能对我来说不是最重要的部分,但稍后我想在不更改库的情况下轻松提高请求/秒比率。
库应该能够对 http 标头进行操作,并且不应该在解析 dns 时出现性能问题。哪个库应该最适合这项任务?
我正在制作网络爬虫。我已经尝试过异步 http 客户端,例如 scala tutorial scaling-out-with-scala-and-akka and spray中的客户端,但我无法让它工作。目前性能对我来说不是最重要的部分,但稍后我想在不更改库的情况下轻松提高请求/秒比率。
库应该能够对 http 标头进行操作,并且不应该在解析 dns 时出现性能问题。哪个库应该最适合这项任务?
喷雾应该足够了。即使在 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)