Ich versuche, einen Algorithmus zu erstellen, um Web-Crawler rekursiv und auf eine funktionale Weise zu tun. Ich weiß, wie man es mit for-Schleifen, var-Variablen und Akkumulieren auf es macht. Aber ich kämpfe, es rekursiv zu tun.Algorithmus für Web-Crawler in Scala
Einige Fragen zu meinem Code: 1. Warum gibt def loop
zurück Any
? 2. Es gibt eine URL im Format http://..../example.zip, in der getLinksPage eine Ausnahme auslöst, None zurückgibt und die Schleife unterbricht. Wie kann ich damit umgehen? 3. Wie kann ich diesen Code mit einem Scala-Framework-Test testen?
def getLinksPage(urlToCrawl: String): Option[List[String]] = {
try {
val conn = Jsoup.connect(urlToCrawl)
val doc = conn.get()
val elements = doc.select("a[href]")
val elementsSc = elements.asScala
val links = elementsSc.map(_.attr("abs:href")).toSeq
val linksURL = links.map(new URL(_))
val tartgetURL = (new URL(urlToCrawl)).getHost
val linksLocalURL = linksURL.filter(_.getHost == tartgetURL).map(_.toString).toList
Some(linksLocalURL)
}
catch {
case e: Exception => None
}
}
def loop(l:Option[List[String]], acc: List[String]): Any = l match {
case Some(Nil) => acc
case Some(hd::tl) => if (!acc.contains(hd)) loop(getLinksPage(hd),hd::acc)
else loop(Option(tl), acc)
case None => acc
}
loop(getLinksPage(mainURL), List(mainURL))
Danke. Was Punkt 3 betrifft, wie kann ich einen Web-Server mit rekursiven http-Links vortäuschen, um den Web-Crawler zu testen? Welcher Rahmen (ScalaMock ...)? – rodbs
Aktualisierte Antwort mit Beispieleinheitstest. Nicht garantiert syntaktisch korrekt. :) –
Ich verstehe nicht, warum Sie diese Eigenschaften verwenden. Und es funktioniert nicht für mich. Ich replizierte Ihren Code mit mir in Edit 2 und es funktioniert nicht – rodbs