簡體   English   中英

Scala JsoupBrowser設置UserAgent

[英]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並且默認構造函數可以正常工作時,為什么第一個引發錯誤?

假設JSBJsoupBrowser的導入別名:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM