IE操作(テーブルスクレイピング)を作ってみた(Ver6と7の「表の値取得(IE)」との比較も)
指定したURL内の表をCSVで出力します。
命名「IE操作(テーブルスクレイピング)」
Ver.7のブラウザ関連ライブラリ「テーブルスクレイピング」のIE向けそっくりさんです。
横流しです。
元ネタ
VBScriptでWEBスクレイピング!テーブル要素を取得してCSVファイルで書き出す
https://tonari-it.com/vbs-ie-table/
加工方法
- 1ページの1テーブルを取得するなら、「スクリプト実行」のスクリプトタブに転記したライブラリ単体で、2か所の加工だけ
1. URL
objIE.navigate "http://elze.tanosii.net/d/kenmei.htm"
- objIE.navigate !URL!
2. 出力ファイル名
Set objText = objFSO.OpenTextFile("C:\work\テーブル要素の書き出し結果.csv", 8, True)
- Set objText = objFSO.OpenTextFile(!出力ファイル名!, 8, true)
注釈タブ
- 元ネタサイトの情報を参考に、適宜情報を載せる想定
ライブラリの使い分け方針案
テーブルスクレイピング関連情報
2020年08月24日 RPAツール「WinActor」の新バージョンVer.7.1.0を販売開始 | NTT-AT
https://www.ntt-at.co.jp/news/2020/detail/release200824.html
テーブルスクレイピングライブラリを用いてウェブページのテーブルをExcelファイルに出力するサンプルシナリオ
https://winactor.biz/samplescenario/2020/08/24_2607.html
【WinActor】Webスクレイピング シナリオレシピ、第1弾!(表の一括取得)|Works ID_キャンスタ編集部|note
https://note.com/works_id/n/n331f14aebc17
【WinActor】Webスクレイピング 作成レシピ第2弾!勤怠管理システムから最速でデータを一括出力する方法|Works ID_キャンスタ編集部|note
https://note.com/works_id/n/n3f2150d31563
「テーブルスクレイピング」相当のパーツ構成
IE操作(テーブルスクレイピング)と、過去ログで紹介されていた近い機能のライブラリについても、複数ページにまたがるテーブルを取得するパーツ構成を考えました。
下の表内、ライトグリーンの行がそのバリエーションです。
6手法の比較表(情報量多めにつき、見づらいのはご容赦を)
画像を別タブに表示したりローカルに保存すると拡大できるので、少しは見やすくなります。
表内、主にURL関連のテキスト
https://winactor.com/questions/?q=Chrome、Edgeを使用時に表の値を一括取得したい
トヨタ自動車(株)【7203】:時系列の株価推移 - Yahoo!ファイナンス
https://info.finance.yahoo.co.jp/history/?code=7203.T&sy=2020&sm=1&sd=1&ey=2020&em=11&ed=25&tm=d&=
Excelのセルの値で重複データを削除するライブラリ
https://winactor.biz/library/2019/04/22_854.html
テーブルスクレイピングライブラリを用いてウェブページのテーブルをExcelファイルに出力するサンプルシナリオ
https://winactor.biz/samplescenario/2020/08/24_2607.html
Works ID_キャンスタ編集部|note
Webスクレイピング 作成レシピ 第2弾!勤怠管理システムから最速でデータを一括出力する方法
https://note.com/works_id/n/n3f2150d31563Webスクレイピング シナリオレシピ 第1弾!(表の一括取得)
https://note.com/works_id/n/n331f14aebc17「表の一括取得(IE)(中略)Ver7.1.0から(中略)処理がめちゃくちゃ早くなった」
表の値取得(IE)内[表の一括取得]の比較(Ver.630 vs Ver.710)
- Works IDさんのコラム通り、確かにめちゃくちゃ速くなった(上の表を更新済み)
- Ver.710
ハイライトが瞬く回数≒1回/テーブル
→ テーブルをまるっと取得していると解釈するのが自然 - Ver.630
ハイライトが瞬く回数≒(列数×行数)回/テーブル
→ 1セルずつ取得していると解釈するのが自然 - 「表の値取得(IE)」単体ではテーブルスクレイピングとしての追記にならず、2ライブラリを追加
この課題においてほかの手法と比較すると、手法の差が所要時間の差の要因の大部分を占めている
この2ライブラリが僅かながら不利に働いたと思われる- テキストファイル読込
- テキストファイル追記
まとめ
- 列×行の取得/追記は、「表の値取得(IE)」の表の一括取得より高速
- IEでも、ライブラリの加工や組み合わせで、実用に耐えるテーブルスクレイピングが可能
繰り返しと画面遷移のアクションをライブラリ内に取り込めば、オフィシャルのブラウザ関連ライブラリ「テーブルスクレイピング」相当も成り立つ
残りの検証 → 以下の通り予想がつくため、見送り
- 2.3.6.は同じ手法
- 2.と3.6.はブラウザの違い
2.と3.6.は1ライブラリで処理するか、複数ライブラリに跨がるかの違い - 3.と6.は1ライブラリ内での処理(コードを眺める限り、ほぼ同じ処理)
6.を同じ課題で競争させるとしたら、「テキストファイル追記」のほうを取り込むことになるか
エラー処理とか相対パスの配慮部分があっても、目に見える速度差はなさそう
きっと10秒強のパフォーマンスを叩き出すと思われる - ここで、ノードの開始と終了が高コストであることを確認済み
https://winactor.com/questions/question/条件分岐、分岐で攻めるか、多分岐で攻めるか/
2.はブラウザの違いはあれども、3.と6.より少し多めにかかる程度と思われる
表内3.「IE操作(テーブルスクレイピング)」のスクリプト
'テーブルを指定
Set objTable = objIE.document.getElementsByTagName("table")(!テーブルインデックス!)'tr要素をコレクションとして取得して変数にセット
Set objTr = objTable.getElementsByTagName("tr")'テーブル要素をcsvファイルに書き出す
For each el In objTrSet objChild = el.Children
objLength = objChild.length - 1trText = ""
For i = 0 to objLength
trText = trText & Chr(34) & objChild(i).innerText & Chr(34) & ","
nextOutputText trText
next
'テキストファイルへ出力
Function OutputText(ByVal strMsg)Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objText = objFSO.OpenTextFile(!ファイル名!, 8, True)objText.write strMsg
objText.write vbCrLfobjText.close
Set objFSO = Nothing
Set objText = NothingEnd Function
- 太字はリファレンスサイトを調べてほぼ全面的に書き直した箇所
- 後半のFunctionはまるまる元ネタのコピーではあるものの、誰が書いてもほぼ同じ表記になる内容のため、権利の問題は発生し得ないと判断
https://winactor.com/questions/question/スクリプトの権利について、本気出して調べてみ/
ユーザーフォーラムのサークル機能を軸に、アウトプットを促進する運動を展開してます。
お時間のあるときにでも覗いてみてください。