Google で画像を検索してURLのリストを出力する
import java.net.HttpURLConnection import java.net.URL import java.net.URLEncoder import scala.io.Source val paramMap = Map( "q" -> "富士山", // 検索する語 "tbs" -> "itp:photo,isz:lt,islt:10mp", // "islt:10mp" は "10メガピクセル以上" を表す "hl" -> "ja", "source" -> "lnt", "biw" -> "1024", "bih" -> "768" ) val url = new URL("http://www.google.co.jp/images?" + paramsMapToQueryString(paramMap, "UTF-8")) val html = getHtml(url, "UTF-8", Map("User-Agent" -> "Mozilla/5.0 (Windows; U; Windows NT 6.1) Firefox/3.6.8")) val rLink = """<a class=rg_l [^>]+>""".r val rUrl = """.+[?;]imgurl=([^&]+).+""".r val imgUrls = (for (rUrl(imgUrl) <- rLink.findAllIn(html)) yield imgUrl).toList imgUrls.foreach(println) printf("%,d件%n", imgUrls.size) exit // 以下は関数定義 def paramsMapToQueryString(params: Map[String, String], enc: String) = { val pairs = for ((name, value) <- params) yield List(name, value).map(URLEncoder.encode(_, enc)) pairs.map(_.mkString("=")).mkString("&") } def getHtml(url: URL, enc: String, headers: Map[String, String]) = { val connection = url.openConnection.asInstanceOf[HttpURLConnection] try { for ((name, value) <- headers) connection.setRequestProperty(name, value) val in = connection.getInputStream try { Source.fromInputStream(in, enc).mkString } finally { in.close } } finally { connection.disconnect } }
いろいろなデジカメで撮ったままのサンプル画像を集める
各社・各機種のデジカメで撮った写真を資料として集める必要があって、それ用のスクリプトを書いてみた。それが下のもの。
デジカメ Watchの「新製品レビュー」のバックナンバーを辿って、画像へのリンクを抽出する。
続きを読むCSVを読み書きするライブラリ「opencsv」のラッパークラス
opencsv の CSVReader をラップして、CSVの1レコードずつ返す Iterator クラス。
import java.io._ import au.com.bytecode.opencsv.CSVReader class ScalaCSVReader(reader: Reader) extends Iterator[Array[String]] with Closeable { require(reader != null) private val csv = new CSVReader(reader) private var nextRow = csv.readNext override def hasNext = nextRow != null override def next = try { nextRow } finally { nextRow = csv.readNext } override def close { csv.close } }
使用例
val reader = new ScalaCSVReader(new FileReader("in.csv")) val rows: List[Array[String]] = try { reader.toList } finally { reader.close }