目次

Go言語の便利な便利なスクレイピングツール

agouti

agouti とは

Selenium WebDriver、PhantomJS、およびChromeDriverをサポートしたGo言語のテストツール.

記事概要

スクレイピングでよく活用するagoutiのよく忘れる配列取得などを備忘録として

Text()とString()の違い

go
1
2
3
4
5
6
7
8
9
10
11
12
s, err := page.Find("複数あるやつ").String()
if err != nil {
    return err
}
// s -> タグの中身が返ってくる
// 例えば,<a>this</a> なら,this

txt := page.Find("複数あるやつ").Text()
if err != nil {
    return err
}
// txt -> selectionが返ってくる 

同じ構造体が複数連なっている場合

go
1
2
3
4
5
6
7
8
9
10
11
num := 個数 // .Count()でも取得可能
for i := 0; i < num; i++ {
    m := page.AllByClass("name")
    // s, err := m.At(i).Attribute("innerHTML")
    s, err := m.At(i).Find("img").Attribute("alt")
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("名前: %s\n", s)
}
// s -> 個別名が返ってくるので配列などで取得

おまけ

[for double if]を使わない構造体の重複チェック

Go言語マップ豆知識: map構造体の第二引数には存在真偽が入っている

go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// mainStruct has too many data 

// 使い捨て用のmap
m := make(map[string]struct{})
// mainStructの入れ替え用
temp := make([]Struct, 0)

for _, v := range mainStruct {
    // mapの第二引数には値の存在真偽が入っているのでIDを使ってチェック
    if _, isThere := m[v.ID]; !isThere { // 入ってない場合tempに追加する
        m[v.ID] = struct{}{} // 追加したことをmapに教える
        temp = append(temp, v)
    }
}

// tempに重複チェック後のmainStructが入っている

もちろん,下記より早い! うまい!!

go
1
2
3
4
5
for {
    for {
        if hoge
    }
}