背景
更新される商品を、定期的にメーカーのサイトからスクレイピングする要望があがった。
そのサイトは、
・ダウンロードをするのに「利用規約に同意」ボタンを押す
・「ダウンロード」ボタンを押す
といったイベントが発生するので、VBAを使用して対応しようとしたが、これがうまく稼働しなかったので、WEBテストツールのKatalon、KatalonStudioを使用した。
1.URLパラメータを取得
ダウンロードURLは、2つの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のプロジェクトを作成
②2で出力した記録したマクロファイルを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"
編集は以下のサイトからオプションを確認。
編集したコマンドを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)
1~5をすべてVBAにまとめて全自動完了。
VBA、Katalonで、色々なスクレイピングに応用できそう。