Rubyでスクレイピングしたい
Rubyを使ってスクレイピングを行う場合、対象のWebサイトがJavaScriptを使っていなければ、NokogiriとMechanizeを使ってスクレイピングする事が可能。
JavaScriptでゴリゴリ画面更新しているようなサイトだと色々導入して、Seleniumとか使う必要が出てくる。
過剰にアクセスしたり、禁止されているサイトへのアクセスはやめましょう。
事前準備
NokogiriとMechanizeを導入。
項目 | 説明 |
---|---|
Nokogiri | HTMLの解析、必要な項目の取得に使う |
Mechanize | ログイン、リンクを踏む、formの操作 |
以下のコマンドで導入します。
$ sudo gem install nokogiri $ sudo gem install mechanize |
Nokogiriはインストールするのに多少時間がかかるかも。
(Raspberry Piにインストールするのに時間かかりました)
使い方
基本的には、以下の方針でアクセスして行きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | require 'nokogiri' require 'mechanize' # __main__ agent = Mechanize. new agent.max_history = 2 agent.user_agent_alias = 'Mac Safari' agent.conditional_requests = false puts login_page.title # フォームを取得 login_form = login_page.form_with(name: 'form1' ) sleep 1 # フォームのIDとパスワード入れる所にID/パスワードを入れる login_form.field_with(name: 'txtID' ).value = 'IDを入れる' login_form.field_with(name: 'txtPASS' ).value = 'パスワード' sleep 1 # pp login_form # ログインを実行する top_page = login_form.click_button # 以下繰り返し... |
NokogiriでHTMLを解析する
ポストバックで取得したHTMLがMechanizeでうまく解析できなかったので、Nokogiriを使ったら解析できた。
: next_page = form.click_button doc = Nokogiri:: HTML .parse(next_page.body) p doc.at_css( '[id="HTMLのidタグを指定する"]' ).value |
これで、必要な項目を抜き出せばOK
Tips
戻るボタンを押す
ブラウザの戻るボタンの動きをしたい時
# agentは agent = Mechanize.new で作ったやつ agent.back |
フォームのボタンを押す
フォームのボタンを押して、次のページに遷移するような時
next_page = some_form.click_button # 場合によっては # next_page = some_form.submit |
ポストバックで作っているページの画面遷移
JavaScriptで画面遷移していても、ページのソースをよくみると解決できる場合がある。
下のJavaScriptが定義されていて
function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } |
HTMLのボタン(リンク)をみると、以下のようになっている時
< a id = "grdMENU_ctl03_lnk03" class = "lnk_2" href = "javascript:__doPostBack('grdMENU$ctl03$lnk03','')" > |
こんな感じで記載して、form.click_buttonすると画面遷移できる。
some_form.field_with(name: '__EVENTTARGET' ).value = 'grdMENU$ctl03$lnk03' some_form.field_with(name: '__EVENTARGUMENT' ).value = '' next_page = some_form.click_button # next_page = some_form.submit <= こっちのパターンもあり...試してみるしかない。 |
0 件のコメント :
コメントを投稿