Groovyスクレイピング & Grape

2019-09-18Groovy

の記事が面白かった。

  • XmlSlurper
  • XmlParser

を使用するとXMLを厳密にチェックするため、HTMlの解析ができなかったけれども、 nekohtml っていうライブラリを利用するとあいまいなHTMlを解釈してパースしてくれるのでいろいろできるよ、っていうエントリ。

最近、いまさらながら

を見て、 grape の機能が便利だな、と思ったのと kiy0taka さんが Grape ライブラリ探すには Maven Repository: Search/Browse/Explore を利用するといいよと教えてくれたので(いずれもいまさらですが・・・)ちょっとスクレイピングのエントリに書き加えてみた。

#!/usr/bin/env groovy
import static java.lang.System.*
import org.cyberneko.html.parsers.SAXParser

// over proxy ..
if( getProperty("http.proxyUser") && getProperty("http.proxyPassword") ){
    def pw = new PasswordAuthentication(
        getProperty("http.proxyUser"),
        getProperty("http.proxyPassword").toCharArray()
    )
    Authenticator.default = { getPasswordAuthentication:{ pw } } as Authenticator
}

// grape
@Grab(group = 'nekohtml', module='nekohtml', version='latest.integration')
class Dummy{}

//--------------------MAIN LOGIC--------------------
def MYCOM = "http://journal.mycom.co.jp/";
def allPage = [];
def parser = new XmlSlurper(new SAXParser()) 

def indexPage = parser.parse("${MYCOM}column/rikei/index.html")
def td= indexPage.'**'.findAll{
    it.name() == 'TD'
}

td.eachWithIndex{ it, index ->
    def number = "${td.size() - index}".padLeft(3,'0');
    allPage << [
        title:"第${number}回_" 
                + it.A.text().replace('?','?') .replace('"','”').replace('/',"/")
        ,url: "${MYCOM}${it.A.@href}"
    ]
}

new File("rikei").mkdir();

allPage.each{ page ->
    println "downlaoding... ${page.title} ${page.url}"
    def contentPage = parser.parse(page.url)
    def content = contentPage.'**'.find{
        it.name()=='DIV' && it.@class=='articleContent'
    }.P.collect{
        it.text() + 'n'
    }.join('n')
    new File("rikei/${page.title}.txt").newOutputStream() << content
}
//--------------------MAIN LOGIC--------------------

6行目から12行目はただ単に社内のfirewallを超えたいがための設定。( 家でやれよ、という突っ込みはなしで

16行目のクラス定義はアノテーションのために必要なのでとりあえず追記。かっこ悪いけど。

これでjarファイルは自動的にダウンロードされた。

2019-09-18Groovy