VBAで手っ取り早くWebスクレイピング

某企業のインターンシッププライベートブランドの研究をしたことがあり、前々からWebスクレイピングに興味があったので、例によってExcelVBAで簡単なコードを書いて、セブンプレミアムの一覧表を作りました。セブンのWebページはURLが定型化(0~9999までのID)されており、普通にFor文をぶん回すという荒業で対応できます。要するにセブンのページに1万回アクセスするのがマクロの趣旨です。IDが不規則な場合には、まず商品一覧からID表をスクレイピングして、それをもとにもう一回内容を取りに行くという二段階になります。

1万回といった大量のアクセスを迷惑行為ととらえるかどうか。例えば2010年の岡崎図書館事件では、サーバーダウンが発生し作成者が逮捕され物議をかもしました(そののち起訴猶予処分)。私の見解としては、1万回程度のアクセスの単発実行であれば、スクリプトの作りにもよるが今どきのサーバーが落ちる可能性は薄いと考えています。クローリングという行為自体はグーグルやアマゾンのような大企業から、有象無象の個々人まで好き勝手にやっている現状であり、インターネットの自由空間では問題が無いと思います。しかしもしサーバーをダウンさせてしまうことになれば、たとえ法的な処罰を受けなくとも、誰かに迷惑をかけることになってしまいます。従って、以下ソースの利用は自己判断・自己責任で行ってください。以下のソースは、セブンに迷惑がかからないように、URLの一部をマスキングしています。

Excel VBAはどの会社でも使えるから最強の実行環境だと思います。でもソースも汚いし、VBAを沢山書いたからといってプログラマとしての成長にはつながりません。私はこれまで、あくまで事務職の立場から、以下にコピペ等で速く情報を処理できるかを考えてVBAを書いてきました。会社ではそういう態度を続けていくとして、プライベートではもう少し良い言語を学びたいものです。

セブンHDツールプレミアム.xlsm

Sub testIE2()
Dim ws As Worksheet
Dim i, j As Long
Dim countURI, countNextClm As Integer
Dim objIE As InternetExplorer 'IEオブジェクトを準備
Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
Dim el As IHTMLElement
Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
Dim colTitle, colTh, colTd, colData, colImg As IHTMLElementCollection 'IHTMLエレメントコレクションを準備
Set ws = ThisWorkbook.Worksheets("Sheet1")
ws.Cells.Clear

objIE.Visible = False 'IEを表示
countURI = 1

i = 1
For countURI = 0 To 9999
    Debug.Print countURI
    objIE.navigate "https://********.jp/*******/search/detail?id=" & countURI 'IEでURLを開く
    
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち
        DoEvents
    Loop
    
    Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット
    Set colTitle = htmlDoc.getElementsByClassName("headLine1 headLine1-line")
    Set colTh = htmlDoc.getElementsByClassName("itemDetail_td")
    Set colTd = htmlDoc.getElementsByClassName("tag color01")
    Set colData = htmlDoc.getElementsByClassName("itemDetail_leadsTxt")
    Set colImg = htmlDoc.getElementsByClassName("itemDetail_img")
    
    If colTh.Length = 0 Then
        GoTo Continue
    End If
    
    ws.Cells(i, 1).Value = countURI
    ws.Cells(i, 2).Value = colTd(0).innerText
    ws.Cells(i, 3).Value = colTitle(0).innerText
    ws.Cells(i, 4).Value = colImg(0).src
    ws.Cells(i, 5).Value = colData(0).innerText
    
    countNextClm = 6
    For Each el In colTh
        ws.Cells(i, countNextClm).Value = "'" & el.innerText
        countNextClm = countNextClm + 1
    Next el
    i = i + 1
Continue:
Next
End Sub

VBAでキー操作を送信する

※金融機関における重要書面確認は顧客の責任です。この記事に書いてあることは真似せず、必ず自分の目で確認してください!!

久々にSBI証券にログインしたら「重要なお知らせ」が溜まっていました。全部確認しないと取引できませんが、いかんせん200件近くあり、手で確認していたのでは日が暮れます。こんなものはどうせ読まないのでパソコンにやらせてしまうことにしました。

手段としてはいろいろ考えられます。比較的しっかりとしたものであればobjIEを使うのが良いのだと思うのですが、数分で作る使い捨てマクロには向きません。今回はSendKeysを使って実現することにしました。やや頼りない感じもしますが、IE以外の様々なアプリを操作することができるので、覚えておいて損はないのでしょう。

なおSendKeysの実行後、なぜかNumLockがオフになってしまいます。なんでなんでしょうね。

www.youtube.com
参考Office TANAKA - Excel VBAステートメント[SendKeysステートメント]

Sub Sample()
    Dim i As Integer
    Application.Wait [Now() + "0:00:05"]
    For i = 1 To 100
        SendKeys "+{Tab 2}"
        SendKeys "{Enter}"
        Application.Wait [Now() + "0:00:02"]
        SendKeys "{Tab 5}"
        SendKeys "{Enter}"
        Application.Wait [Now() + "0:00:02"]
    Next i
End Sub

VBSによるファイルダウンローダーの実現

企業内のPCでは往々にして自由なソフトウェアのインストールが禁じられています。その結果、例えばダウンローダーが入れられないため、URLは分かっているファイルを一括ダウンロードする術が無いということがあります(手作業で右クリック⇒保存をしていると日が暮れる数のファイル)。そこで当ブログでは、Windows機であれば環境問わず実行可能なスクリプト(VBS)で簡易的なダウンローダーの作成を行いました。ファイルの大量ダウンロードとかいう新入社員にありがちな糞な仕事を任せられたら、これでちゃっちゃと終わらせてしまいましょう。

使い方
(1)以下のソースファイル(myDownloader.vbs)と同じ階層に、boxという名前のフォルダとmyDownloadList.txtを作成する。
(2)myDownloadList.txt内に、ダウンロードしたいファイルのURLを1行ごとに列挙する。
(3)myDownloader.vbs を実行。するとbox内にファイルがダウンロードされて溜まっていく。


やっつけで調べながら作ったので、ソースが汚いのはご容赦ください。
暇があれば関数化して見やすく改良します。誰かしてください。


myDownloader.vbs

Dim objFSO
Dim objFile

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If Err.Number = 0 Then
    Set objFile = objFSO.OpenTextFile("myDownloadList.txt")
    If Err.Number = 0 Then
        Do While objFile.AtEndOfStream <> True

        cReqURL = objFile.ReadLine
        Set objFileSystem = WScript.CreateObject("Scripting.FileSystemObject")
        Set objShell = WScript.CreateObject("WScript.Shell")
        Set objXmlHttp = WScript.CreateObject("MSXML2.XmlHttp")

        cFileName = objFileSystem.getFileName(cReqURL)
        cReqPath = objFileSystem.getParentFolderName(cReqURL) & "/"


        objXmlHttp.Open "GET", cReqPath & cFileName, False
        objXmlHttp.SetRequestHeader "Pragma", "no-cache"
        objXmlHttp.SetRequestHeader "Cache-Control", "no-cache"
        objXmlHttp.SetRequestHeader "If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT"
        objXmlHttp.Send

        intStatus = objXmlHttp.status

        If (intStatus <> 200) Then
            WScript.Echo "FAILED" & vbCrLf & vbCrLf & "HTTP status code is" & intStatus & vbCrLf & cFileName
            WScript.Quit
        End If

        Set objStream = WScript.CreateObject("ADODB.Stream")
        objStream.Open
        objStream.Type = 1
        objStream.Write objXmlHttp.responseBody
        objStream.SaveToFile objShell.CurrentDirectory & "\box\" & cFileName, 2

        objStream.Close

        Set objFileSystem = Nothing
        Set objStream = Nothing
        Set objXmlHttp = Nothing

        Loop
        objFile.Close
    Else
        WScript.Echo "File couldn't be opened: " & Err.Description
    End If
Else
    WScript.Echo "Error: " & Err.Description
End If

Set objFile = Nothing
Set objFSO = Nothing

WScript.Echo "Successfully done."
WScript.Quit

普通自動二輪教習 2-5, 2-6

2016/5/3
【2-5】前半は実車で1・2コースをまわり、後半はシミュレーター室に移動してケース教習。シミュレーターに乗って、交差点で危険なシチュエーションを疑似体験する。例えばトラックの陰に乗用車が隠れていて、あやうく激突してしまうシーンなど、シミュレーターとはいえヒヤッとした。二輪教習は路上に出ないだけに貴重な体験になったと思う。

【2-6】第二段階は思いのほかやることが無く、今回もひたすら1・2コースの走り込み。苦手としていた平均台も最近は割と走りとおせるようになって、多少自信がついてきている。あとは右左折前のライン取りなどの細かい部分はまだまだ弱いと指摘。最後に波状路を体験するが、いきなり立ち乗りでコース一周を指示され、のろのろとそのまま波状路へ。体験しただけでハイおしまいだったので、正直何か身についた感じはしませんでした。

普通自動二輪教習 2-1, 2-2

2016/4/30

【2-1】第二段階の1時限目はシミュレーター教習からスタート。シミュレーター室に行くが、実際は教官による講義がメイン。二輪の教習では路上に出ることは無いが、第二段階では主に法規走行を意識して教習所内をまわることになる。四輪の免許を持っていると言っても、学科の内容が頭に入っているかというとあやふやなため、教官が要点をおさらいしてくれた。具体的には(1)進路変更の合図は3秒前、右左折の合図は30m前 (2)優先道路、左方優先の違い (3)追い抜きと追い越しについて 全部が全部、他の受講生も含めて間違えまくっていたポイントとなっている。こんな状態で学科を免除されてしまって本当に良いのだろうか。

【2-2】教習所のコースは外周と内周で2コースあり、第一段階のみきわめは外周を走行した。今回は法規走行を意識しつつ、内周のコースを走行。まずは教官のバイクについていき、安全確認をすべきタイミング、合図のタイミング、右折時の右寄せのタイミング等を覚えていく。検定のコースなので一本橋があるがまた脱輪。急制動は3速で停車するが、無意識的にローに落としてしまうのを注意される。全体的に走りがまだ弱いとの厳しいお言葉。もう一周一人で走行して、教習終了。一人でやらせてくれる方が楽しいけど、きっとあれこれ間違っているんだろう。

普通自動二輪教習 1-8, 1-9

2016/4/24
【1-8】今回はシミュレーター教習。使用するシミュレーターの筐体は三菱プレシジョン製で、ソフトウェアはWindows XP上で動いている模様。教官と1対1でゆるい感じ。AT車モードにしてもらって、実際の峠道を模したようなコースをドライブしていく。路面のコンディションは、マンホール・鉄板・砂利道・濡れた路面の4パターンに変化することがある。カーブの途中にマンホールがあったりすると、いとも簡単に挙動を失いつるっと転倒してしまいます。橋梁を通過する場面では、強烈な横風が吹いてきて思わず反対車線まで飛ばされる経験も。これは実車ではとても真似できない・・・。「実際に横風が吹いてきたらどうすれば良いんですか?」と先生に聞いてみたところ、「速度を落とすしか無いねぇ」とのお返事。四輪ではよっぽどでない限り意識する必要がなかった、路面状況や横風が、バイクの場合は事故に直結する。バイク乗りは常に死神に付きまとわれているのではないか、そんなことを考えさせられた1時間でした。

【1-9】第一段階最後の教習は、いわゆる「みきわめ」。みきわめとは、これまでに習った技能が十分に身についているかどうかを確かめるもので、前もってコースを覚えてくることが求められます。今回のコースは坂道→スラローム→S字→一本橋急制動→クランク→踏切、この一連の道のりを間違えずに頭に叩き込まなくてはいけません。イメージトレーニングは完ぺきだったのですが、急制動のスタート位置を間違えたり、四輪車の横をすり抜けたりして激しく怒られてしまいました。バイクの免許以前に交通マナーからやり直したほうが・・・。発進・停止もまだまだ乱暴ですねと言われ、クランクのパイロンに接触もし、みきわめは不合格かなと覚悟しましたが・・・!?「微妙ですねぇ~ 一応良好にしときましたけど、人の10倍・20倍練習してくださいね!」という優しいお言葉!ありがとうございます(泣)やっと第二段階に進めます!

普通自動二輪教習 1-6, 1-6(2), 1-7

2016/4/21
【1-6】この日はしょっぱなから「この先2時間続けてスラロームの練習していかきますね~」と言われ、早くも延長を予感させるブルーなスタート。しかも雨が降り始めてきたため、メガネをしている僕は非常に気が乗らない(教習所のメットには前のシールドが無いのです)。気が乗らない日は本当に何もかもついてない結果に終わるもので、ウォーミングアップからして教官についていけない始末。スラロームは遅いし、一本橋も落ちまくる。今回の教習項目自体は、バランスのとりかた(曲線)だが、どうやらそれ以前に直すべきところが山積みのような気がする。当然のごとく、また不合格がついて落第! 雨も強まってきてやる気がなくなってしまい、この日の以降の教習はキャンセルしてしまいました。

2016/4/22
【1-6(2)】晴天なれど気持ちは晴れず。教習に向かうのが憂鬱、「教習所 辞めたい」「最終学歴 自動車学校中退」などのワードでネット検索してしまう。やる気がないうえに厳しい教官にあたってしまい、また駄目かと思う。ただ、この日は存外調子がよく、一本橋は3回中3回成功し明らかにうまくなっている(タイムも7秒超えており問題なし)。スラロームは当初10秒かかっていたが、教官からアクセルを開けるタイミングを教えてもらうと効果てきめんで8.8秒まで短縮。スラロームのコツは、フットブレーキをなるべく使わないこと、そしてアクセル→体傾ける→アクセル→体傾ける・・・リズム良く繰り返すことと学びました。今回は大満足で文句なしに合格できました。

【1-7】続けて坂道発進AT車実習。坂道発進は、四輪でも不思議に得意だった項目で、教官から上出来と褒められる。当然モチベーションも高まる。AT車は非常に重いというのが第一印象。半クラッチが使えないので、右手の微妙な動きだけで車速を調整しないといけないのが逆に怖い感じ。ニーグリップが使えないデメリットというのは正直実感できなかったが、あえて言うならハンドル操作だけでカーブを曲がる感覚(体を傾けるのが難しい)というのはあったかもしれないな。

AT車のデメリットで、ニーグリップが使えない・車長が長い・重い・車輪が小さいとよく言われますが、すべて車体のデザインで解決する問題のように思えます。なぜMT車と同じデザインにしないのでしょうか?知っている方がいたら教えてください。

(ご利用条件)当ブログは筆者の個人的見解を述べたものであり、筆者の所属する団体またはその公式見解とは一切関係がありません。当ブログは特定の金融商品の売買を推奨または勧誘またはあっせんするものではありません。当ブログにおいて情報提供の対価として閲覧者から金銭を徴収することはありません。当ブログの内容の正確性に関しては万全を期していますが、筆者は何らその保証を行うものではありません。投資は自己責任です。当ブログの内容をもとにして生じた損害について、筆者は一切の責任を負いません。