首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪个scala或java库可以用来以最有效的方式每天从1000个域抓取10M个页面

哪个scala或java库可以用来以最有效的方式每天从1000个域抓取10M个页面
EN

Stack Overflow用户
提问于 2013-09-28 22:18:08
回答 1查看 2.8K关注 0票数 2

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

库应该能够在http头上操作,并且在dns解析方面应该不会有性能问题。哪个库应该是最适合该任务的?

EN

回答 1

Stack Overflow用户

发布于 2013-09-28 23:56:42

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

代码语言:javascript
复制
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)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19067919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档