見出し画像

第58回 複数ページのWebをさくっとまとめてスクレイピング!

今後のスケジュールはコチラ
投げ銭ページはコチラ

登壇者:りゅうりゅう@VBAer × ココナラPRO認定
日時 :2024年6月22日 21時
テーマ:「Webから」ボタン操作をマクロの記録をして、そのマクロを改良して同じサイトの複数ページにまたがった表データを連続でスクレイピングさせるってのをライブコーディングでやってみるよ!

りゅうりゅうの変態モニタ
登壇すると知識が増えるあるある
長ぇーよw



自己紹介

けっしてあやしい行為ではありません
最初にできないこと書いてくれるのは親切ね。
WebAPIとの違い
ベーマガ! 懐かしぃぃぃ
このページをかき集めたい!(スクレイピング)
実際やってみて、これが完成した表
えらいじゃん
バージョン限定
古いのはこっち。
かもネ(じらすね)


URLをメモ帳に

パラメータ付きURL

ライブコーディング


先ほどのURLを張り付け
ココ選択して読み込み
読み込んだテーブルができる。
マクロの記録で出来たVBAマクロ

パワク処理は2段階。パワクで取り込む上段とテーブルに変換する下段

取り込む部分の改造

ここがクエリ名
クエリ名。クエリ名も操作が必要。
はい、できます。今回は*ですべてが対象
この部分の年月を変更して連続してWeb情報を取得する。


クエリ名はこの3か所

マクロ名の変更、各種変数宣言と代入

Subの先頭はsbとるすのがりゅうりゅう流



クエリ名とURLの一部を変数に置き換え。これを実行すると。。
クエリができる
中身も大丈夫そう

テーブル化する部分の改造

クエリ名テーブル名などをzl掲載号に変更
実行してみるとテーブルになった!

ついでにシート名も変更。

Option Explicit

Sub abWeb取り込み()
  
  Dim zl年      As String
  Dim zl月      As String
  Dim zl掲載号  As String
  
  
  zl年 = 1982
  zl月 = Format(8, "00")
  zl掲載号 = "掲載号" & zl年 & "年" & zl月 & "月"
  
  
  ActiveWorkbook.Queries.Add Name:= _
    zl掲載号, Formula:= _
    "let" & Chr(13) & "" & Chr(10) & "    ソース = Web.BrowserContents(""https://www.aabmg.com/yearbook/list.php?sY=" & zl年 & "&sM=" & zl月 & """)," & Chr(13) & "" & Chr(10) & "    #""HTML から抽出されたテーブル"" = Html.Table(ソース, {{""Column1"", ""TABLE.list > * > TR > :nth-child(1)""}, {""Column2"", ""TABLE.list > * > TR > :nth-child(2)""}, {""Column3"", ""TABLE.list > * > TR > :nth-child(3)""}, {""Column4"", ""TABLE.list > * > TR > :nth-child(4)""}}, [R" & _
    "owSelector=""TABLE.list > * > TR""])," & Chr(13) & "" & Chr(10) & "    変更された型 = Table.TransformColumnTypes(#""HTML から抽出されたテーブル"",{{""Column1"", type text}, {""Column2"", type text}, {""Column3"", type text}, {""Column4"", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    変更された型" & _
    ""
  ActiveWorkbook.Worksheets.Add
  With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
    "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=""" & zl掲載号 & """;Extended Pr" _
    , "operties="""""), Destination:=Range("$A$1")).QueryTable
    .CommandType = xlCmdSql
    .CommandText = Array( _
    "SELECT * FROM [" & zl掲載号 & "]")
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .ListObject.DisplayName = zl掲載号
    .Refresh BackgroundQuery:=False
  End With
  
 ActiveSheet.Name = zl掲載号
End Sub

月を8月にすれば、シートがどんどん増えるぜぇ。

年と月を引数にしてサブルーチン化

赤矢印の部分も忘れずに
・・・なぜw
こうしてみんな騙される。

ループ処理・確認用プロシージャー

ループ処理本番


実行結果。ちゃんと取れてるぅぅぅ。

テーブルをがっちゃんこ

一番上選択で、そのあとテーブルのみフィルタ等で整える。
不要列・行削除で整える。

風柳判For~Nextバージョン

ループ処理確認用プロシージャ(別解)貼り付けておきます
Forループでもできるということで…

Sub sb確認用1()
    Dim zl年月 As Date
    Dim zl停止年月 As Date
    zl年月 = DateSerial(1982, 7, 1)
    zl停止年月 = DateSerial(1983, 1, 1)
    Do While zl年月 <= zl停止年月
        Debug.Print zl年月
        zl年月 = DateAdd("m", 1, zl年月)
    Loop
End Sub

Sub sb確認用2()
    Dim zl年月 As Date
    Dim i As Long
    zl年月 = DateSerial(1982, 7, 1)
    For i = 0 To DateDiff("m", zl年月, DateSerial(1983, 1, 1))
        Debug.Print zl年月
        zl年月 = DateSerial(Year(zl年月), Month(zl年月) + 1, 1)
    Next
End Sub

Webクエリボタンとの違い ※2016以前

ファイル

ちゅんちゅん日誌

20240622 第58回 PowerQuery

ゆえまる日誌

こちら

投げ銭ページ

投げ銭ページはこちら

次回はちゅんさんの登壇!

登壇内容案1
登壇内容案2
登壇内容案3
これら3つから1つやるぅぅぅ

この記事が気に入ったらサポートをしてみませんか?