http://q.hatena.ne.jp/1209185751
とりあえず、

Excelのシート上のボタンを押すと、指定したURLのページの天気の画像と、最高気温を取ってみたいと思います。
ここんとこよく取り上げてる「スクレイピング」ですね。
こないだやったのは、
これは文字から緯度・経度を取ってくる、ってものでした。
今回は、固定のページから指定した部分を抜き出してくる、ということで前よりは簡単そうです。
ただ、「画像を抜き出したい」とのことなので、それはこの前とはちょっと違いますね。
まず、HTMLのソースを取ってきてみます。
-
Sub test()
-
Dim oHttp As Object
-
Set oHttp = CreateObject("MSXML2.XMLHTTP")
-
oHttp.Open "GET", "http://weather.livedoor.com/area/20/72.html", False
-
oHttp.Send
-
Debug.Print oHttp.responseText
-
End Sub
こないだのYahoo!のトップを取ってくるのと同じですね。URLが違うだけです。
実行してみると、

ん、取れてるようです(^^)
天気と最高気温の部分はどこかな?
-
<table border="0" cellpadding="0" cellspacing="0" align="center" width="100%">
-
</tr>
-
</table>
-
<table border="0" cellpadding="0" cellspacing="0" align="center" width="100%" class="tableline">
-
<td rowspan="4" align="center" class="tdline" width="20%">
-
<div style="margin-bottom:5px;">
-
<small>曇時々雨</small>
-
</div>
-
-
<table border="0" cellpadding="1" cellspacing="0">
-
</tr>
-
-
</tr>
このあたりですね。
まず、簡単なほう、最高気温のほうから取ってみます。
ソースを見てみると、
<small>15℃</small>
の部分の「℃」の文字が一番最初に出てくるのが、この最高気温の部分のようです。
ということは、ソースの中から「℃」を探して、その前の数字の部分(>の後ろのから℃の前まで)が最高気温、ということになりそうです。
「℃」の位置を求めるには、いつものInstrでよさげです。
-
Sub test()
-
-
Dim oHttp As Object
-
Dim getSource As String
-
-
Set oHttp = CreateObject("MSXML2.XMLHTTP")
-
oHttp.Open "GET", "http://weather.livedoor.com/area/20/72.html", False
-
oHttp.Send
-
getSource = oHttp.responseText
-
-
Debug.Print InStr(getSource, "℃")
-
-
End Sub
実行してみると
![]()
実行するときの状況によって値は異なると思いますが、私が取り込んだ時点では7954文字目に「℃」があるようです。
次は、その前の 「>」の位置を調べなければいけないんですが。。。
「>」は、ソースの中にいっぱいありますから、単純に Instr では求められません。
この場合、後ろから文字を探す、InStrRevが使えそうです。
最初から「℃」までを抜き出した文字列を作り、その文字の後ろから「>」を探す、って感じですね。
-
Sub test()
-
-
Dim oHttp As Object
-
Dim getSource As String
-
Dim nukidashi As String
-
Dim saikoukion As String
-
-
Set oHttp = CreateObject("MSXML2.XMLHTTP")
-
oHttp.Open "GET", "http://weather.livedoor.com/area/20/72.html", False
-
oHttp.Send
-
getSource = oHttp.responseText
-
-
nukidashi = Mid(getSource, 1, InStr(getSource, "℃"))
-
Debug.Print InStrRev(nukidashi, ">")
-
-
saikoukion = Mid(nukidashi, InStrRev(nukidashi, ">") + 1)
-
Debug.Print saikoukion
-
-
End Sub
nukidashiという変数に、先頭から「℃」までの文字列を代入して、
InStrRev(nukidashi, ">") でnukidashiの後ろから「>」を探しています。
saikoukionに、「>」の次の文字以降の文字列を取ってくる、という風にしています。
実行してみると、

ん、取れました(^^)
後は、これをセルに代入すればいいですね。これは後でまとめてやります。
次、天気なんですけど。「画像を取りたい」ってことなので、流れとしては、画像をダウンロードして、
その画像をシートに貼り付ける、って感じでいいのかな?
まずソースの中から画像の部分を探してみます。
-
<table border="0" cellpadding="0" cellspacing="0" align="center" width="100%">
-
</tr>
-
</table>
-
<table border="0" cellpadding="0" cellspacing="0" align="center" width="100%" class="tableline">
-
<td rowspan="4" align="center" class="tdline" width="20%">
-
<div style="margin-bottom:5px;">
-
<small>曇時々雨</small>
-
</div>
この辺ですね。この「<img src=・・・・>」の部分を取ってくればいいんですが。
ソース全体でみれば、<img>タグは他にもいっぱいあるので、簡単には探せませんね。
ということで、この近辺をなんとか抜き出して、その中で<img>を抜き出す、ってことで。
全体のソースをみると、「今日の天気」という文字列は、この部分で初めて出てくるようです。
ということは、全体のソースから「今日の天気」を探し、そこ以降の文字列を抜き出し、その中で最初に出てくる<img>を抜き出せばよさげです。
こんな感じになります。
-
Sub test()
-
-
Dim oHttp As Object
-
Dim getSource As String
-
Dim nukidashi As String
-
Dim saikoukion As String
-
-
Set oHttp = CreateObject("MSXML2.XMLHTTP")
-
oHttp.Open "GET", "http://weather.livedoor.com/area/20/72.html", False
-
oHttp.Send
-
getSource = oHttp.responseText
-
-
'最高気温を取ってきます。
-
nukidashi = Mid(getSource, 1, InStr(getSource, "℃"))
-
saikoukion = Mid(nukidashi, InStrRev(nukidashi, ">") + 1)
-
-
'「今日の天気」以降の文字列を抜き出します。
-
nukidashi = Mid(getSource, InStr(getSource, "今日の天気"))
-
-
'抜き出した文字列の中で、最初の 「 <img 」以降を抜き出します。
-
nukidashi = Mid(nukidashi, InStr(nukidashi, "<img"))
-
-
'抜き出した文字列の中で、最初の 「 " 」の次の文字以降を抜き出します。
-
nukidashi = Mid(nukidashi, InStr(nukidashi, """") + 1)
-
-
'抜き出した文字列の中で、最初の 「 " 」の前の文字までを抜き出します。
-
nukidashi = Mid(nukidashi, 1, InStr(nukidashi, """") - 1)
-
-
Debug.Print nukidashi
-
-
End Sub
画像のURLを取ってくるところまで書いちゃいましたが、
・まず、「今日の天気」以降を抜き出します。
・次に、その文字列から「<img 」を探し、それ以降の文字列を抜き出します。
・次に、その文字列から 「 " 」(src="の部分です)を探し、その文字の次の文字以降の文字列を抜き出します。
・最後に、その文字列から 「"」(src=の終わりの"です)を探し、その文字の前の文字までを抜き出します。
実行すると、こんな感じ。

取れました(^^)
後は、このURLの画像を貼り付ければいいんですが、、、画像のダウンロードってどうやるのか?
で検索して見つかった、こちらのページからリンクされていた、こちらのページの説明がわかりやすかったです。
ということで、こんな感じ。
-
'URLDownloadToFile API from URLMON.
-
Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
-
"URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
-
szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
-
-
-
Private Sub CommandButton1_Click()
-
-
Dim oHttp As Object
-
Dim getSource As String
-
Dim nukidashi As String
-
Dim saikoukion As String
-
-
Dim strURL As String
-
Dim strFNAME As String
-
Dim returnValue
-
-
Set oHttp = CreateObject("MSXML2.XMLHTTP")
-
oHttp.Open "GET", "http://weather.livedoor.com/area/20/72.html", False
-
oHttp.Send
-
getSource = oHttp.responseText
-
-
'最高気温を取ってきます。
-
nukidashi = Mid(getSource, 1, InStr(getSource, "℃"))
-
saikoukion = Mid(nukidashi, InStrRev(nukidashi, ">") + 1)
-
-
'シートに代入します
-
ActiveSheet.Cells(1, 4).Value = saikoukion
-
-
'「今日の天気」以降の文字列を抜き出します。
-
nukidashi = Mid(getSource, InStr(getSource, "今日の天気"))
-
-
'抜き出した文字列の中で、最初の 「 <img 」以降を抜き出します。
-
nukidashi = Mid(nukidashi, InStr(nukidashi, "<img"))
-
-
'抜き出した文字列の中で、最初の 「 " 」の次の文字以降を抜き出します。
-
nukidashi = Mid(nukidashi, InStr(nukidashi, """") + 1)
-
-
'抜き出した文字列の中で、最初の 「 " 」の前の文字までを抜き出します。
-
strURL = Mid(nukidashi, 1, InStr(nukidashi, """") - 1)
-
-
'ダウンロードする画像をルートのtenki.gifにします。
-
'画像上書きしますので、注意してください。
-
strFNAME = "\tenki.gif"
-
-
'URLDownloadToFile API をコールする
-
returnValue = URLDownloadToFile(0, strURL, strFNAME, 0, 0)
-
-
'画像を挿入したいセルを選択します。
-
ActiveSheet.Cells(1, 2).Select
-
-
'ダウンロードした画像を今のセルの位置に挿入します。
-
ActiveSheet.Pictures.Insert Filename:="\tenki.gif"
-
-
End Sub
もう、全部作っちゃいました(^^;)。コメントが入ってますので、それを見ればどこで何をやってるかは分かると思います。
このファイルがあるドライブのルートディレクトリにtenki.gifという名前で画像を保存して、それをシートに貼り付ける、というふうになっています。なので、tenki.gifというファイルがあったら、上書きされちゃいますので実行するときは注意してください。
実行すると、こんな感じ

ん、できました(^^)
ここに置いておきます→vbastudy_26


