0

指定した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)

 

注釈タブ

  • 元ネタサイトの情報を参考に、適宜情報を載せる想定

 

ライブラリの使い分け方針案

     

    テーブルスクレイピング関連情報

    https://winactor.com/questions/?q=表の一括取得

    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を使用時に表の値を一括取得したい

    https://winactor.com/questions/question/webページ上の表全体を選択したい/

    トヨタ自動車(株)【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/n3f2150d31563

    Webスクレイピング シナリオレシピ 第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 objTr

        Set objChild = el.Children
        objLength = objChild.length - 1

        trText = ""

            For i = 0 to objLength
                trText = trText & Chr(34) & objChild(i).innerText & Chr(34) & ","
            next

        OutputText trText

    next

    'テキストファイルへ出力
    Function OutputText(ByVal strMsg)

        Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
        Set objText = objFSO.OpenTextFile(!ファイル名!, 8, True)

        objText.write strMsg
        objText.write vbCrLf

        objText.close

        Set objFSO = Nothing
        Set objText = Nothing

    End Function

    • 太字はリファレンスサイトを調べてほぼ全面的に書き直した箇所
    • 後半のFunctionはまるまる元ネタのコピーではあるものの、誰が書いてもほぼ同じ表記になる内容のため、権利の問題は発生し得ないと判断

    https://winactor.com/questions/question/スクリプトの権利について、本気出して調べてみ/

     

     

    ユーザーフォーラムのサークル機能を軸に、アウトプットを促進する運動を展開してます。
    お時間のあるときにでも覗いてみてください。

    https://winactor.com/questions/circle/

    質問の編集

    回答とコメントは、会員登録(無料)で閲覧できるようになります。
    会員登録(無料)する