Katalon、VBAを使用してWEBスクレイピング

#背景
更新される商品を、定期的にメーカーのサイトからスクレイピングする要望があがった。

そのサイトは、

・ダウンロードをするのに「利用規約に同意」ボタンを押す
・「ダウンロード」ボタンを押す

といったイベントが発生するので、VBAを使用して対応しようとしたが、これがうまく稼働しなかったので、WEBテストツールのKatalon、KatalonStudioを使用した。

##1.URLパラメータを取得

ダウンロードURLは、２つのHTMLパラメータを含んでいたため、VBAを使用してパラメータを取得し、
CSVへ出力する処理をまずは実装した。

以下のようなファンクションを作成し、商品掲載URLをパラメータとして渡して、ダウンロードURLのクエリパラメータをCSVへ出力した。
自動ダウンロード先のURLにセットするURLパラメータをCSVに出力する。
getElementByあたりは、それぞれのサイトの環境ごとにカスタマイズ。

```
Function xxxxx_data(xxxxxx_url As String, output As String, objIE As Object)

Dim htmldoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
Set htmldoc = seturl(xxxxx_url, objIE)

Dim count As Integer
count = Replace(htmldoc.getElementsByClassName("hitCount")(0).outerText, "該当製品数：", "")

Dim array1 As Variant
array1 = Array(): ReDim array1(count - 1)
Dim i As Integer
Dim s As Integer
Dim id1 As String
i = 0
s = 0

'URLを取得
    For i = 0 To count - 1
    id1 = "r" & i
    array1(i) = htmldoc.getElementById(id1).getElementsByClassName("datacell")(2).getElementsByTagName("a")
    Next i

'ファイルに出力
    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")
     
    stream.Type = 2
    stream.Charset = "Shift_JIS"
    stream.LineSeparator = 10
    stream.Open
    stream.Position = 0

    Dim str1 As String
    Dim str2 As String
    Dim str3 As String
    
    For i = 0 To count - 1 - s
    If (array1(i) Is Nothing) = False Then
    str1 = EXT(array1(i), "did=", "&", 4)
    str2 = EXT(array1(i), "prodName=", "&", 9)
    str3 = str1 & "," & str2
    stream.WriteText str3, 1
    End If
    Next i
    
    stream.SaveToFile "C:\Users\Public\Documents\scraping\this_month\" & output, 2
    stream.Close
    
    Set stream = Nothing
    Set htmldoc = Nothing
End Function
```
##2.KatalonでWEB操作をレコード
chromeにkatalon　recorder　拡張機能を追加し、ダウンロードサイトのダウンロード操作を記録。操作は至って簡単。
記録が終わったら、KatalonStudio型式でエクスポート。
（KatalonStudioにも記録機能は付いているのでそちらで行うこともできる）

##3.KatalonStudioのインストール＆インポート
KatalonStudioを以下からダウンロードしてインストール。
https://www.katalon.com/

①KatalonStudioのプロジェクトを作成
②２で出力した記録したマクロファイルをTestCaseにインポート。
③インポートしたスクリプトを編集
　スクレイピングで作成したCSVファイルからURLパラメータを取得して、ダウンロードのURLに
その値をセットし、「同意する」、「ダウンロード」ボタンを押す　という自動処理を実行するようにgroovyを編集

```
WebUI.openBrowser('https://www.katalon.com/')

def driver = DriverFactory.getWebDriver()

String baseUrl = 'https://www.katalon.com'

selenium = new WebDriverBackedSelenium(driver, baseUrl)

//読み込むCSVファイル名をパラメータに渡し実行
dwnld('xxx.csv')

//関数を定義
def dwnld(a){
f = new File('C:\\Users\\Public\\Documents\\scraping\\this_month\\' + a)

def monthlyList = []
f.splitEachLine(',', { def data ->
        monthlyList.add(data)
    })
monthlyList.each({ def data ->
        if(a == 'toshiba_motordriver.csv'){
        selenium.open('https://xxx.com/xxx/xxx.jsp?did=' + data[0] + '&displang=ja')
        }else{
        selenium.open('https://xxx.com/xxx/xxx.jsp?did=' + data[0] + '&prodName=' + data[1] + '&displang=ja')
        }
        sleep(500)
        //同意ボタンを押す
        selenium.click('name=consent')
　　　　//ダウンロードボタンを押す
        selenium.click('name=downloadBtn')
        sleep(300)
    })
}
```
ここまででKatalonStudio上でTestCaseを実行するとダウンロードしたいファイルを自動的にダウンロードできるようになる。

##4.TestCaseを自動実行
 3で作成したTestCaseを自動実行するために、Katalonのコマンドを実行するbatファイルを作成。
コマンドを作成するには、対象となるTestCaseを選択し、Katalon画面の上部中央箇所のボタン「Build CMD」で簡単に作成される。browsertypeはchromeに変更。

```
katalon -noSplash  -runMode=console -consoleLog -projectPath="C:\Users\xxxxx\Katalon Studio\scraping\scraping.prj" -retry=0 -testSuitePath="Test Suites/xxxxxxxxx" -executionProfile="default" -browserType="Chrome"
```

編集は以下のサイトからオプションを確認。

https://docs.katalon.com/katalon-studio/docs/console-mode-execution.html#execute-katalon-in-cmd

編集したコマンドをbatに貼り付け。

##5.bat実行
VBAからbatを実行

    Dim obj As New IWshRuntimeLibrary.WshShell
    Dim ret As Long
    ret = obj.Run("C:\Users\Public\Documents\scraping\program\xxxxx\" & bat1, 1, True)

１～５をすべてVBAにまとめて全自動完了。
VBA、Katalonで、色々なスクレイピングに応用できそう。