WebサイトからデータをExcelに取得する方法④

みなさん、こんちには!

いよいよ取得したテキストから、必要な項目を切り分けていきましょう。
Internet Explorerを使う場合は、下記のようなメソッドが使えるのですが、

getElementById                id属性値で指定
getElementsByClassName  Class属性値で指定
getElementsByName         Name属性値で指定
getElementsByTagName    タグ名で指定

今回は、テキスト操作に今後も役立つ区切り文字で取得していきたいと思います。

下記は、区切り文字で切り出すためのコードになります。
私自身かなりの頻度で使っています。

Function SplitGet(strExpr As String, ByVal strSep As String) As String
    Dim p1 As Long, p2 As Long
 
    SplitGet = ""
    If strExpr = "" Or strSep = "" Then Exit Function
    For p1 = 1 To Len(strExpr) Step Len(strSep)
        If Mid$(strExpr, p1, Len(strSep)) <> strSep Then Exit For
    Next
    
    p2 = InStr(p1, strExpr, strSep)
    If p2 = 0 Then
        SplitGet = Mid(strExpr, p1)
        strExpr = ""
    Else
        SplitGet = Mid(strExpr, p1, p2 - p1)
        strExpr = Mid(strExpr, p2 + Len(strSep))
    End If
End Function
 
それでは、テスト的に商品名を取り出したいと思います。こちらのサイト「https://www.rakuten.co.jp/」から、もう少し実用的な商品一覧ページ「https://www.rakuten.co.jp/category/555086/?l-id=top_normal_gmenu_d_ladiesfashion_001」から切り分けていきます。

テキストを見ながら 商品一覧ページをブラウザで見てみると、
<div class=”dui-container searchresults”>
から、商品一覧が始まっていると思われるので、それまでの文字列をこのタグで区切って取り除いてみましょう。

 

Dim TmpStr As String
TmpStr = SplitGet(HTML_str, "<div class=" & Chr(34) & "dui-container searchresults" & Chr(34) & ">")
 

文字列の中に「”」を表示するとエラーになるので「” & Chr(34) & “」に置き換えています。

次に商品一覧が終わったと思われる下記までを タグで区切って取り除いてみましょう。
<div class=”dui-container pagination _centered”

Dim Shohin_str As String
Shohin_str = SplitGet(HTML_str, "<div class=" & Chr(34) & "dui-container pagination _centered")
 
Shohin_str 変数に商品一覧部分のテキストが代入されました。
それでは、商品名を取得してみましょう。
商品名は <a title= ・・・・・ > 商品名 </a> のようにタグで囲まれるので抽出してみましょう。しかし「 ・・・・・ 」の部分は、商品によって変わりますので、分割して取り除きます。
これをコードに表して見ましょう。
 
Dim TmpStr As String
Dim SyohinName As String
TmpStr = SplitGet(Shohin_str, "<a title=")
TmpStr = SplitGet(Shohin_str, ">")
SyohinName = SplitGet(Shohin_str, "</a>")
 
SyohinName 変数に商品名が代入されました。

次回は、総まとめで商品一覧の中の商品名全てをシートに抽出したいと思います。

 

WebサイトからデータをExcelに取得する方法④

みなさん、こんちには!

いよいよ取得したテキストから、必要な項目を切り分けていきましょう。
Internet Explorerを使う場合は、下記のようなメソッドが使えるのですが、

getElementById                id属性値で指定
getElementsByClassName  Class属性値で指定
getElementsByName         Name属性値で指定
getElementsByTagName    タグ名で指定

今回は、テキスト操作に今後も役立つ区切り文字で取得していきたいと思います。

下記は、区切り文字で切り出すためのコードになります。
私自身かなりの頻度で使っています。

Function SplitGet(strExpr As String, ByVal strSep As String) As String
    Dim p1 As Long, p2 As Long
 
    SplitGet = ""
    If strExpr = "" Or strSep = "" Then Exit Function
    For p1 = 1 To Len(strExpr) Step Len(strSep)
        If Mid$(strExpr, p1, Len(strSep)) <> strSep Then Exit For
    Next
    
    p2 = InStr(p1, strExpr, strSep)
    If p2 = 0 Then
        SplitGet = Mid(strExpr, p1)
        strExpr = ""
    Else
        SplitGet = Mid(strExpr, p1, p2 - p1)
        strExpr = Mid(strExpr, p2 + Len(strSep))
    End If
End Function
 
それでは、テスト的に商品名を取り出したいと思います。こちらのサイト「https://www.rakuten.co.jp/」から、もう少し実用的な商品一覧ページ「https://www.rakuten.co.jp/category/555086/?l-id=top_normal_gmenu_d_ladiesfashion_001」から切り分けていきます。

テキストを見ながら 商品一覧ページをブラウザで見てみると、
<div class=”dui-container searchresults”>
から、商品一覧が始まっていると思われるので、それまでの文字列をこのタグで区切って取り除いてみましょう。

 

Dim TmpStr As String
TmpStr = SplitGet(HTML_str, "<div class=" & Chr(34) & "dui-container searchresults" & Chr(34) & ">")
 

文字列の中に「”」を表示するとエラーになるので「” & Chr(34) & “」に置き換えています。

次に商品一覧が終わったと思われる下記までを タグで区切って取り除いてみましょう。
<div class=”dui-container pagination _centered”

Dim Shohin_str As String
Shohin_str = SplitGet(HTML_str, "<div class=" & Chr(34) & "dui-container pagination _centered")
 
Shohin_str 変数に商品一覧部分のテキストが代入されました。
それでは、商品名を取得してみましょう。
商品名は <a title= ・・・・・ > 商品名 </a> のようにタグで囲まれるので抽出してみましょう。しかし「 ・・・・・ 」の部分は、商品によって変わりますので、分割して取り除きます。
これをコードに表して見ましょう。
 
Dim TmpStr As String
Dim SyohinName As String
TmpStr = SplitGet(Shohin_str, "<a title=")
TmpStr = SplitGet(Shohin_str, ">")
SyohinName = SplitGet(Shohin_str, "</a>")
 
SyohinName 変数に商品名が代入されました。

次回は、総まとめで商品一覧の中の商品名全てをシートに抽出したいと思います。

 

WebサイトからデータをExcelに取得する方法③

みなさん、こんちには!

前回の文字化けを解決して行きましょう。
今回は、ADODB.Stream を使った文字コードの変換をしてみます。

「ADODB.Streamオブジェクト」を CreateObject関数で生成する。

Dim Strm As Object
Set Strm = CreateObject(“ADODB.Stream”)

準備が整いましたので、変換してみましょう。

With Strm
    .Open
    .Position = 0
    .Type = 1 'adTypeBinary
    .Write web_con.responseBody
    
    .Position = 0
    .Type = 2 'adTypeText
    .Charset = "EUC-JP"
    HTML_str = .ReadText
    .Close
End With

前回の web_con.responseText から web_con.responseBody に変わっているのに、気付かれたと思います。返り値が違うのです。

responseText は、返り値はテキスト
responseBody は、返り値はバイナリ

ADODB.Stream を順を追ってコメントしていきます。
.Open  ADODB.Stream を開きます。
.Position = 0 カーソルを一番最初に移動する。
.Type = 1 バイナリモードに設定する。
.Write web_con.responseBody バイナリデータを書き込み
.Position = 0 カーソルを一番最初に移動する。
.Type = 2 テキストモードに設定する。
.Charset = “EUC-JP” 文字コードEUC-JP に設定する。
HTML_str = .ReadText  EUC-JP で訳したテキストを読み出す。
.Close  ADODB.Stream を閉じる。

今回出来上がったコードを表示します。

Dim HTML_str As String
Dim web_con As Object
Dim Strm As Object
Set web_con = CreateObject("MSXML2.XMLHTTP")
Set Strm = CreateObject("ADODB.Stream")
 
web_con.Open "GET", "https://www.rakuten.co.jp/",False
web_con.Send
 
Do While web_con.readyState < 4
DoEvents
Sleep 1
Loop
 
With Strm
    .Open
    .Position = 0
    .Type = 1 'adTypeBinary
    .Write web_con.responseBody
    
    .Position = 0
    .Type = 2 'adTypeText
    .Charset = "EUC-JP"
    HTML_str = .ReadText
    .Close
End With
 
Debug.Print HTML_str
次回は、今回のコードを使って https://www.rakuten.co.jp/ から必要なデータを取得して見たいと思います。

WebサイトからデータをExcelに取得する方法②

みなさん、こんちには!

前回に引き続き、 WebサイトからExcelを使ってデータを取得 していきます。
今回は、 ステータスを取得し状態を確認してからデータを取得する方法 です。

下記は、前回までのコードです。これに状態を確認して読み込み完了するまで待機するコードを追加していきます。

Dim web_con As Object
Set web_con = CreateObject("MSXML2.XMLHTTP")
 
web_con.Open "GET", "https://www.rakuten.co.jp/",False
web_con.Send

readyStateプロパティを使って読み込み完了の状態になるまで確認を繰り返すコードを見てみましょう。

Do While web_con.readyState < 4
DoEvents
Sleep 1
Loop

web_con.readyState < 4 の 「4」は、 読み込み完了 を表す定数になります。
Sleep 1 は、1ミリ秒を停止するWindows API関数になります。
VBAには Application.Wait メソッドがあるのですが、何時になるまで停止すると言う意味になります。単位も基本的には秒単位になります。これを同じ1ミリ秒を停止するコードを表すと下記になります。

Application.Wait Now() + 1 / 86400000

1ミリ秒を表すのみ1ミリ秒/1日になります。コードの見た目なのか秒単位しか出来ないと勘違いなのかは分かりませんが、 Sleep 1 の方が良く使われている様です。
ただし、API関数を使う為には別のコードが必要になります。下記に表示します。

#If VBA7 Then
Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
このコードは標準モジュールに記述しましょう。
Excelの32bit・64bitの両方に対応しています。
 

いよいよデータの取得になります。
responseText プロパティを使ってテキストで取得するコードが下記になります。

Dim HTML_str As String
HTML_str = web_con.responseText

実行してみましょう。

Dim HTML_str As String
Dim web_con As Object
Set web_con = CreateObject("MSXML2.XMLHTTP")
 
web_con.Open "GET", "https://www.rakuten.co.jp/",False
web_con.Send
 
Do While web_con.readyState < 4
DoEvents
Sleep 1
Loop
 
HTML_str = web_con.responseText
Debug.Print HTML_str
 
テキストが文字化けしているのに気付くと思います。
次回は、文字コードを変換して正しくテキストを表示してみましょう。

WebサイトからデータをExcelに取得する方法①

みなさん、こんちには!

WebサイトからExcelを使ってデータを取得する方法は幾つかありますが、
今回はInternet Explorerを使わずに、 HTTPリクエストして、
取得してみたいと思います。

まずは、友だちに配布出来る様にライブラリを追加せずにCreateObject関数を使って
HTTPリクエストをする方法から

XMLHttpRequestオブジェクト 」を CreateObject関数 で生成する。

Dim web_con As Object
Set web_con = CreateObject(“MSXML2.XMLHTTP”)

準備が整いましたので、早速Webサイトに HTTPリクエストしてみましょう。

Openメソッドを使って、リクエストをする。

web_con.Open “GET”, URL
web_con.Send

ちなみ「GET」リクエストを取得する場合に使います。送りたいときは「 Post 」を使います。
今回は取得のみなので 「GET」 を使います。

Dim web_con As Object
Set web_con = CreateObject("MSXML2.XMLHTTP")
 
web_con.Open "GET", "https://www.rakuten.co.jp/",False
web_con.Send

 

web_con.Open "GET",URL,False
最後に「False」が 付いているの非同期で取得する為です。
これでWebサイトに接続ができました。

 

次回は、ステータスを取得し状態を確認してからデータを取得する方法に続きます。