0
我想創建一個算法來以遞歸方式和以功能方式進行網絡爬蟲。 我知道如何使用for循環,var變量並累積它。 但我很努力地遞歸做它。在Scala中的網絡爬蟲算法
關於我的代碼的一些問題: 1.爲什麼def loop
返回Any
? 2.有一些URL形式爲http://..../example.zip,其中getLinksPage引發異常,返回None並中斷循環。我該如何處理它? 3.我如何用一些Scala框架測試來測試這段代碼?
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))
謝謝。關於第3點,我如何使用遞歸http鏈接在本地模擬Web服務器來測試Web爬蟲?哪個框架(ScalaMock ...)? – rodbs
使用示例單元測試更新答案。不保證句法正確。 :) –
我不明白你爲什麼使用這些特質。它不適合我。我在編輯2中複製了我的代碼並且它不起作用 – rodbs