|
動作するものを一応作って見ました。
<<結果シート>>のレイアウト
A列 B列 C列 D E F
1 コード 保険者番号 保険者名 郵便番号 住所 電話番号
2
3
・予め設定されているA列の保険者用のコードを読み込んで使用します。
・B列以下の列に、サーバーから取得結果を書き込みます。
・同一であることを念のため確保するため、B列はA列と同じものを書き込みます。
-----------------
動作することを確認していますが、保証するものではありません。
また、スクレイピングに関しての責任は負いかねます。
データの著作権等について十分確認して下さい。
また、サーバーに連続してアクセスすると負荷が掛かり、
これを禁止するところもあります。
そこで、0.2秒の間隔を空けてアクセスするようにしていますが、
これは最低限守ってください。
(連続アクセスをした人が逮捕された"守口図書館事件"が有名です。
検索してみてください。)
-----------------
なお、今後、「仕様の変更依頼等には一切応じる積もりはありません。」
予めご了解ください。
頻度がそう高いものではないのですから、3時間ですむなら、
今の簡潔なものでも十分と思います。
XMLHt■tpRequestと正規表現を使ったコードを以下に示します。
なお、エイチティーティーピーと言う単語が使用禁止になっていますので、
元に戻してから使用してください。("■"を""に置換すればよいでしょう)
Option Explicit
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim re As Object
Dim Match As Object
Dim Matches As Object
Dim Ht■tpRequest As Object
Dim mat() As String
Sub main()
Dim ws As Worksheet
Dim s1 As String
Dim s2 As String
Dim s As String
Dim uri As String
Dim myText As String
Dim k As Long
Dim lastRow As Long
Dim kosu As Long
Dim t
t = Timer
Set Ht■tpRequest = CreateObject("MSXML2.XMLHT■TP.3.0")
Set re = CreateObject("VBScript.RegExp")
Set ws = Worksheets("結果")
s1 = "ht■tp://hokeninfolist.main.jp/sp/dt"
s2 = ".html"
lastRow = ws.Cells(Rows.Count, 1).End(xlUp).Row
kosu = lastRow - 1
ReDim mat(1 To kosu, 1 To 5) '一時保持用配列
For k = 1 To kosu
Sleep 200 ' サーバー負荷を考慮して、0.2秒間隔を空ける
s = ws.Cells(k + 1, "A").Value
uri = s1 & s & s2
' サイトからHTMLファイルを取得
myText = getHT■TPText(uri)
If myText <> "" Then
'HTMLを解析して該当項目を取得
Call setEachDataToMat(myText, k)
Else
'何もしない
End If
Next
'結果をシートに貼付
[B2].Resize(kosu, 5).Value = mat
Debug.Print Timer - t
End Sub
Sub setEachDataToMat(myText As String, k As Long)
Dim j As Long
'保険者番号,保険者名,郵便番号,住所を取得し、配列matに書込む
re.pattern = """dt"">(.*?)</div>"
re.IgnoreCase = True
re.Global = True
Set Matches = re.Execute(myText)
j = 1
For Each Match In Matches
mat(k, j) = Match.SubMatches(0)
j = j + 1
If j >= 5 Then Exit For
Next
'電話番号
re.pattern = """dttel""><(?:.*?)>(.*?)</a>"
Set Matches = re.Execute(myText)
mat(k, 5) = Replace(Matches(0).SubMatches(0), " ", "")
End Sub
Function getHT■TPText(uri As String) As String
With Ht■tpRequest
.Open "GET", uri, False
.send
'return codeが200でないとき(例:404該当無しなど)
If Not (.Status >= 200 And _
.Status < 300) Then
getHT■TPText = ""
Exit Function
End If
getHT■TPText = .responseText
End With
End Function
|
|