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 }