Hatena::ブログ(Diary)

駄文生産所 このページをアンテナに追加 RSSフィード

2013-05-22

キーワードにマッチした2chスレのリストを取得するGroovyスクリプト

Groovyで、キーワードマッチした2chスレリストを取得するスクリプトを書いた。スクレイピングにjsoup、並行処理にGParsを使っている。

板の数は800を超えるが、wait無しの複数スレッドでドカンとやれば、パズーの身支度より早く終る。ただし、調子に乗ると規制されてアクセスできなくなるので注意すること。

えーとその、もうしないので許してください。ゴメンナサイ。


import org.jsoup.*
import org.jsoup.nodes.*
import org.jsoup.select.*
import groovyx.gpars.GParsPool

List keywords = ['iPhone', 'アイフォン', 'アイフォーン']


String bbsTable = 'http://menu.2ch.net/bbstable.html'
List ignoreBBSList = [
    '2ch総合案内', '地震ヘッドライン', '地震速報', '臨時地震', '臨時地震+', '緊急自然災害@超臨時',
    'テレビ番組欄',
    '2chプロジェクト',
    'いろいろランキング',
    '削除依頼', '批判要望',
]

Document doc = Jsoup.connect(bbsTable).get()
Elements anchors = doc.getElementsByTag('a')

List bbsList = []
String reg = /^http:\/\/\w+\.2ch\.net\/\w+\/$/
anchors.each {Element elem ->
    String name = elem.text()
    String url = elem.attr('href')
    if ((url ==~ reg) &&  (! ignoreBBSList.contains(name))) {
        bbsList << [name, url]
    }
}


List threads = []
GParsPool.withPool(1) { // 規制上等で一気に取得したい場合は増やす
    bbsList.eachParallel {String bbsName, String bbsUrl ->
        sleep(1000) // ここも調整
        println("取得中: " + bbsName)

        try {
            String subjects = new URL(bbsUrl + 'subject.txt').getText('SHIFT_JIS')
            subjects.eachLine {String line ->
                (line =~ /^(\d+)\.dat<>(.+)\(\d+\)$/).each { String all, String threadId, String threadName ->
                    if (keywords.any {String keyword -> threadName.matches(/(?i).*$keyword.*/)}) {
                        threads << [bbsName:bbsName, bbsUrl:bbsUrl, threadName:threadName, threadId:threadId]
                    }
                }
            }
        } catch (e) {
            println("!!! ERROR !!! " + [bbsName, bbsUrl, e.message])
        }
    }
}


println()
println()
threads.each {
    println it
}

取得中: 一人暮らし
取得中: プロバイダー
取得中: インスタント麺
取得中: 美容
取得中: 癒し
取得中: Walker+
取得中: 面白ネタnews
    <snip>
取得中: 天国
取得中: ニー速


[bbsName:プロバイダー, bbsUrl:http://engawa.2ch.net/isp/, threadName:【IP電話】Vivafon(iPhone/Win用)【Skype/アジルフォン】 , threadId:1321980902]
[bbsName:面白ネタnews, bbsUrl:http://kohada.2ch.net/be/, threadName:iPhoneぶっ壊れたwwwww , threadId:1356962936]
[bbsName:面白ネタnews, bbsUrl:http://kohada.2ch.net/be/, threadName:iPhoneアプリ「笑えるコピペ」に採用されそうな面白い話を教えて! , threadId:1338139697]
[bbsName:ビジネスnews+, bbsUrl:http://anago.2ch.net/bizplus/, threadName:【決算】KDDI、前3月期は増収増益 iPhone効果生かす[13/04/30] , threadId:1367305621]
[bbsName:ビジネスnews+, bbsUrl:http://anago.2ch.net/bizplus/, threadName:【携帯】iPhone、日本の携帯電話出荷1位に[13/04/25] , threadId:1366859028]
    <snip>
[bbsName:天国, bbsUrl:http://anago.2ch.net/heaven4vip/, threadName:妹が風呂入ってたからiPhoneで写真撮ったら , threadId:1368793734]

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証