gpt4 book ai didi

performance - 使用什么scala或java库可以以最有效的方式每天从1000个域中抓取+10M页面

转载 作者:行者123 更新时间:2023-12-02 21:48:45 26 4
gpt4 key购买 nike

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

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

最佳答案

喷雾应该足够了。即使在 16mbit 连接上使用这个非常简单的代码,我也可以每秒搜索大约 8 个页面,即每天 700,000 个页面。它获取维基百科主页上的所有链接,加载所有这些页面,然后获取这些页面上的所有链接。问题是维基百科的服务器可能会限制每个客户端的流量,因此如果我同时访问多个站点,我应该会获得更快的速度。它使用并行收集来加速并避免通过 dns 解析造成的延迟。但如果你用 actor 和/或 future 正确地编写这个,使用像 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)

关于performance - 使用什么scala或java库可以以最有效的方式每天从1000个域中抓取+10M页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19067919/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com