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

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
 
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を使ったら解析できた。

:
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 件のコメント :

コメントを投稿