[英]Scala JsoupBrowser set UserAgent
我正在使用scala-scraper庫進行網絡抓取。 我想創建一個List[JSoupBrowser]
,其中包含具有唯一用戶代理的JsoupBrowsers
列表。 目前,我有以下代碼,
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-craper的JSoupBrowser源代碼發現,該類聲明是
class JsoupBrowser(val userAgent: String = "jsoup/1.8", val proxy: java.net.Proxy = null) extends Browser
我是Scala的新手,所以也許這只是對構造函數的誤解。
當將具有正確類型的參數提供給可選參數userAgent
並且默認構造函數可以正常工作時,為什么第一個引發錯誤?
假設JSB
是JsoupBrowser
的導入別名:
import net.ruippeixotog.scalascraper.browser.{JsoupBrowser => JSB}
JSB()
是合法的,因為它是對JsoupBrowser
的伴隨對象中的apply
方法的調用。 從鏈接的源代碼中可以看到,此apply
方法僅調用new JsoupBrowser()
。 基本上,這是一種使用默認參數創建JsoupBrowser
實例的便捷方法。
如您所知,如果要覆蓋默認的userAgent
參數,則必須使用new
關鍵字實例化JsoupBrowser
。 但是,您認為這完全是由於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(_))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.