[Ruby] CLIでスクレイピングする (Nokogiri, Mechanize)

## Rubyでスクレイピングしたい Rubyを使ってスクレイピングを行う場合、対象のWebサイトがJavaScriptを使っていなければ、NokogiriとMechanizeを使ってスクレイピングする事が可能。 JavaScriptでゴリゴリ画面更新しているようなサイトだと色々導入して、Seleniumとか使う必要が出てくる。 過剰にアクセスしたり、禁止されているサイトへのアクセスはやめましょう。 ### 事前準備 NokogiriとMechanizeを導入。 | 項目 | 説明 | |-----------|------------------------------------| | Nokogiri | HTMLの解析、必要な項目の取得に使う | | Mechanize | ログイン、リンクを踏む、formの操作 | 以下のコマンドで導入します。 ```ruby `gutter:false; $ sudo gem install nokogiri $ sudo gem install mechanize ``` Nokogiriはインストールするのに多少時間がかかるかも。 (Raspberry Piにインストールするのに時間かかりました) ## 使い方 基本的には、以下の方針でアクセスして行きます。 ```ruby `gutter:true; require 'nokogiri' require 'mechanize' # __main__ agent = Mechanize.new agent.max_history = 2 agent.user_agent_alias = 'Mac Safari' agent.conditional_requests = false login_page = agent.get('https://アクセスしたいWebサイト') 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を使ったら解析できた。 ```ruby `gutter:false; : next_page = form.click_button doc = Nokogiri::HTML.parse(next_page.body) p doc.at_css('[id="HTMLのidタグを指定する"]').value ``` これで、必要な項目を抜き出せばOK ## Tips ### 戻るボタンを押す ブラウザの戻るボタンの動きをしたい時 ```ruby `gutter:false; # agentは agent = Mechanize.new で作ったやつ agent.back ``` ### フォームのボタンを押す フォームのボタンを押して、次のページに遷移するような時 ```ruby `gutter:false; next_page = some_form.click_button # 場合によっては # next_page = some_form.submit ``` ### ポストバックで作っているページの画面遷移 JavaScriptで画面遷移していても、ページのソースをよくみると解決できる場合がある。 下のJavaScriptが定義されていて ```html `gutter:false; function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } ``` HTMLのボタン(リンク)をみると、以下のようになっている時 ```html `gutter:false; <a id="grdMENU_ctl03_lnk03" class="lnk_2" href="javascript:__doPostBack('grdMENU$ctl03$lnk03','')"> ``` こんな感じで記載して、form.click_buttonすると画面遷移できる。 ```ruby `gutter:false; 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 件のコメント :

コメントを投稿