2017-10-07 47 views
0

我正在使用scala-scraper庫進行網頁抓取。我想創建一個List[JSoupBrowser],其中包含具有唯一用戶代理的JsoupBrowsers列表。目前,我有以下的代碼,Scala JsoupBrowser set UserAgent

import net.ruippeixotog.scalascraper.browser.{JsoupBrowser => JSB} 
class Scraper() { 

    def userAgents : List[String] = 
    List (
     "Mozilla/5.0 (Linux; Android 7.0; Pixel C Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.98 Safari/537.36" 
    ) 


    def browsers : List[JSB] = userAgents.foreach(agent => JSB(agent)) // throws err 
    // def browsers: List[JSB] = userAgents.foreach(agent => JSB()) // no err 
} 

然而,這引發錯誤

Cannot resolve reference JSoupBrowser with such signature

望着scala-scraper JSoupBrowser source 透露類聲明

class JsoupBrowser(val userAgent: String = "jsoup/1.8", val proxy: java.net.Proxy = null) extends Browser

我是新來的斯卡拉,所以也許這只是一個英里對建設者的理解。

當爲可選參數userAgent提供具有正確類型的參數並且默認構造函數正常工作時,爲什麼第一次拋出錯誤?

回答

1

假設JSBJsoupBrowser進口別名:

import net.ruippeixotog.scalascraper.browser.{JsoupBrowser => JSB} 

JSB()是合法的,因爲它是在JsoupBrowser的同伴對象apply方法的調用。正如您從鏈接的源代碼中看到的,此apply方法僅調用new JsoupBrowser()。基本上這是一種使用默認參數創建JsoupBrowser實例的便捷方法。

當你想通了,如果要覆蓋默認userAgent參數,你必須使用new關鍵字來實例化一個JsoupBrowser。然而,你錯誤地認爲這完全是由於JsoupBrowser是一個類。您必須使用new的原因是因爲JsoupBrowser的伴侶對象中沒有任何重載版本apply,因此您可以覆蓋默認參數。這方面的一個例子是:

object JsoupBrowser { 
    ... 
    def apply(agent: String): Browser = new JsoupBrowser(userAgent = agent) 
    ... 
} 

由於apply以上版本不可用,你不能叫JSB(agent),你必須使用new JSB(agent)

而且,更直接的方式來創建一個List[JSB]是:

def browsers: List[JSB] = userAgents.map(new JSB(_)) 
+0

我願意接受我的答案,但你要好得多。謝謝! – Skam

相關問題