プログラミング

【golang】agoutiでスクレイピングツール作成日記vol.1

どうもダイコーです。現在プログラミングにハマっているんですが、これがなかなか難しい。駆け出し修行僧の身分なんですが、備忘録的な感じで書いていこうと思います。覚えたら書く!っていうアレですね。

というかスクレイピングツール作成とか書いてますけど、全然完成とかしてないです。ログインするとこだけしかできてません。先は長いですが頑張っていきましょう!

agoutiでのスクレイピングツール作成時に悩んだこと:ログインしたいけど…

結構時間かかりました。ログインするサイトを変えるだけで手こずるとは…情けない。でももう大丈夫なはずなのでとりあえず書きます。

参考にしたサイト
https://qiita.com/tenten0213/items/1f897ff8a64bd8b5270c

今回の全コード

login.go

package main
 import (
     "github.com/sclevine/agouti"
     "log"
 )
 func main() {
     // ブラウザはChromeを指定して起動
     driver := agouti.ChromeDriver(agouti.Browser("chrome"))
     if err := driver.Start(); err != nil {
         log.Fatalf("Failed to start driver:%v", err)
     }
     defer driver.Stop()

     page, err := driver.NewPage() 
     if err != nil {
         log.Fatalf("Failed to open page:%v", err) 
     } // ログインページに遷移
     if err := page.Navigate("指定したいURL"); err != nil {
         log.Fatalf("Failed to navigate:%v", err) 
     }
     // ID, Passの要素を取得し、値を設定
     identity := page.FindByID("user_login")//ユーザー名欄のhtmlのidの部分を入力
     password := page.FindByID("user_pass") //パスワード欄のhtmlのidの部分を入力
     identity.Fill("ログイン時のユーザー名") 
     password.Fill("ログイン時のパスワード") 
     // formをサブミット 
     if err := page.FindByClass("button-large").Submit(); err != nil { 
         log.Fatalf("Failed to login:%v", err) 
     } 
     // 処理完了後、3秒間ブラウザを表示しておく
 }

IDとPASSWORDを入力後、ログインする時

関数Findを使ったんですが、Findの部分の先に FindBy IDやFindBy Classと言うふうにどの部分を抜き出すかを選択することができます。

例えばWordPressのログインフォームのユーザー名を入力する場所のhtmlが以下のようになっているとします。(私がやったときはこれだった)

<input type="text" name="log" id="user_login" class="input" value size="20" autocapitalize="off">

この場合、

identity := page.FindByID("user_login")

とすることでhtmlの「id="user_login" 」の情報を指定していることになるみたいです。

その後ユーザー名を実際に入力してもらうために関数Fillを利用して

identity.Fill("ログイン時に入力するユーザー名")

と書けばちゃんとログインフォームにユーザー名を入力してくれます。同じ要領でパスワードもできます。

ログインボタンを押してもらいたい

上記の方法でユーザー名とパスワードを入力できました。あとはログインボタンをポチッと押してもらうだけ…だったのですが。

なかなかうまくいきません。てかいろいろ遠回りしてたみたいで、実際はめちゃくちゃ簡単でした。悔しいィ

先に答えを書いておきます。これを書けばログインボタンを押してくれました。

if err := page.FindByClass("button-large").Submit(); err != nil { 
     log.Fatalf("Failed to login:%v", err)  
}

問題はこのClassの中身の"button-large"を入力するまでに時間がかかったと言うことです。この部分を正しく書いておかないとユーザー名とパスワードを入力しただけで止まってしまいます。

んで元のコードを改造しようとしていた初めの頃は、どうして先に進んでくれないのかがわかっていませんでした。他のサイトから関数clickを使っているコードを見つけたので試したりしたんですがうまくいかない(おそらく正しく書けばclickでもうまくログインボタンを押してくれる)。

と言うのも安易な気持ちで

click := page.Find("click")
click.Click()

と言うふうに書いてみたら

パスワードを表示させるボタンをポチッとしちゃいました。「そこじゃねぇよ!!」と思いながらコードを確認し直してようやく原因がFindByClassにあると気づいたんですね。

そしてそこからがまた長かった。どこを抜き出せばいいのか分からなかったからですね。実際のhtmlのコードは

<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="ログイン">

と言うふうになっていました。じゃあ今まで通りclassの中身である"button button-primary button-large"を入れればいいと思っていたら動作せず…何がいけないんだとずっと考えてました。ちなみに参考にしたQiitaにログインするためのコードはこれです。

   if err := page.FindByClass("loginSessionsForm_submit").Submit(); err != nil {
        log.Fatalf("Failed to login:%v", err)
    }

そしてやっと気づきました。それは検証で確認しているときでした。

「…ん?もしかしてinput~の最後の.以下だけじゃないか?」

そう思い実行するとビンゴ!やっと完成しました。いやぁよかった。

本日の教訓:検証ツールと参考コードはよく見比べるべし

無事完成!

と言うことで無事ログインを自動化させることができました。この部分以外は完全に丸パクリで、自分で書けと言われれば絶対無理です。できっこない。でもこういう悩んで解決を繰り返していくことで、いつかちゃんと自分で理解しながらコードを書けるようになれると信じて勉強していこうと思います。

ブログ月次報告

2023/5/1

【月刊PBマガジン5月号】新たな挑戦への第一歩

先月のPBマガジンはこちら。 今月も振り返りの時が来た。一ヶ月が早すぎないか? PCBuildnet.comの月間アクセス数・収益【4月】 過去1年を含めたアクセス数および収益状況は下記のとおり。(お知らせ記事は除く) 執筆数 合計記事数 月間PV 収益(円) 2023/4 2 45 20,637 53,064 2023/3 1 43 20,782 31,425 2023/2 3 42 17,342 30,453 2023/1 2 39 27,338 17,958 2022/12 1 40 22,774 ...

続きを読む

サイトからのお知らせ

2023/4/22

ネットショップをオープンしました!

2023年4月22日、ネットショップをオープンしました。 限定特価のPCを用意しておりますので、ぜひご検討ください。

続きを読む

ガジェット

2023/5/1

【MX Mechanical Mini for Macレビュー】コンパクトキーボードの価値を探ってみた

お久しぶりです、Jinです。 この記事は一言で言うと mx mechanical mini for macがどんなキーボードかわかる記事 になります。 mx mechanical mini for macはどんなことができるの? 機能はいいから、実際の使い心地はどうなんだ? 自分にはmx mechanical mini for macが合うのだろうか? こんな疑問にお答えします。 mx mechanical mini for macは2022年の10月、ロジクールから登場したキーボードです。 コンパクトな ...

続きを読む

ブログ月次報告

2023/5/1

【月刊PBマガジン4月号】振り返らなければ、何もしていなかったことになっていた

先月の報告はこちら。 PCBuildnetの月間アクセス数・収益 過去1年を含めたアクセス数および収益状況は下記のとおり。 執筆数 合計記事数 月間PV 収益(円) 2023/3 1 43 20,782 31,425 2023/2 3 42 17,342 30,453 2023/1 1 39 27,338 17,958 2022/12 1 38 22,774 21,472 2022/11 1 37 16,981 13,298 2022/10 0 36 11,642 7,496 2022/9 4 36 15 ...

続きを読む

ブログ月次報告

2023/5/1

【月刊PBマガジン3月号】PCBuildnetのロードマップを作る【創刊号】

自身を奮い立たせるためと、これからブログ・アフィリエイトを始めようとしている人の参考にしてもらうために、ブログの記録を残すことにした。今回は創刊号。めでたい。 月間アクセス数・収益 過去1年のアクセス数および収益状況を公開する。 執筆数 合計記事数 月間PV 収益(円) 2023/2 3 42 17,342 30,453 2023/1 1 39 27,338 17,958 2022/12 1 38 22,774 21,472 2022/11 1 37 16,981 13,298 2022/10 0 36 ...

続きを読む

  • この記事を書いた人

じん

自作PC組み立ての代行をやってます。 チェンソーマンとDr.Stoneが好き。

-プログラミング