我正在制作网络爬虫。我已经尝试过异步http客户端,比如scala tutorial、scaling-out-with-scala-and-akka和spray的客户端,但是我无法让它工作。现在性能对我来说不是最重要的部分,但以后我想在不改变库的情况下轻松地提高请求/秒比率。
库应该能够在http头上操作,并且在dns解析方面应该不会有性能问题。哪个库应该是最适合该任务的?
发布于 2013-09-28 23:56:42
喷雾应该就足够了。即使在16mbit的连接上使用这个非常简单的代码,我也可以每秒搜索大约8页,即每天70万页。它获取维基百科主页上的所有链接,加载所有这些页面,然后获取这些页面上的所有链接。问题是维基百科的服务器可能会限制每个客户端的流量,所以如果我同时访问几个网站,我应该会获得更快的速度。它使用并行收集来加速,并通过dns解析避免延迟。但如果你用演员和/或未来正确地写这篇文章,使用像spray这样的库,我猜它会更快。
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)https://stackoverflow.com/questions/19067919
复制相似问题