## 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 件のコメント :
コメントを投稿