🙆

サンプルVBA

2024/06/06に公開
Sub ScrapeWithShiftJIS()
    Dim xmlhttp As Object
    Dim url As String
    Dim userAgentPC As String
    Dim userAgentSP As String
    Dim html As String
    Dim binaryData() As Byte
    Dim stream As Object
    Dim doc As Object
    Dim pageTitle As String
    Dim pageH1 As String
    Dim ws As Worksheet
    Dim rowNum As Integer
    
    ' シートを設定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    rowNum = 1 ' 開始行番号

    ' PC用User-Agentを設定
    userAgentPC = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    
    ' スマホ用User-Agentを設定(例: iPhoneのUser-Agent)
    userAgentSP = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
    
    ' リクエストするURL
    url = "https://exaple.com"
    
    ' PCとスマホ用User-Agentで繰り返し
    Dim userAgents As Variant
    userAgents = Array(userAgentPC, userAgentSP)
    
    Dim i As Integer
    For i = LBound(userAgents) To UBound(userAgents)
        ' MSXML2.XMLHTTPのオブジェクトを作成
        Set xmlhttp = CreateObject("MSXML2.XMLHTTP")
        
        On Error GoTo ErrorHandler
        
        ' GETリクエストを初期化
        xmlhttp.Open "GET", url, False
        
        ' User-Agentを設定
        xmlhttp.setRequestHeader "User-Agent", userAgents(i)
        
        ' リクエストを送信
        xmlhttp.send
        
        ' レスポンスのステータスをチェック
        If xmlhttp.Status = 200 Then
            ' バイナリデータを取得
            binaryData = xmlhttp.responseBody
            
            ' ADODB.Streamを使用してバイナリデータを文字列に変換
            Set stream = CreateObject("ADODB.Stream")
            With stream
                .Type = 1 ' バイナリデータ
                .Open
                .Write binaryData
                .Position = 0
                .Type = 2 ' テキストデータ
                .Charset = "Shift-JIS"
                html = .ReadText
                .Close
            End With
            
            ' HTMLを解析してタイトルと最初のh1を取得
            Set doc = CreateObject("htmlfile")
            doc.Write html
            
            On Error Resume Next
            pageTitle = doc.getElementsByTagName("title")(0).innerText
            pageH1 = doc.getElementsByTagName("h1")(0).innerText
            On Error GoTo 0
            
            ' 結果をExcelのセルに入力
            ws.Cells(rowNum, 1).Value = "User-Agent " & (i + 1)
            ws.Cells(rowNum, 2).Value = "Title: " & pageTitle
            ws.Cells(rowNum, 3).Value = "H1: " & pageH1
            rowNum = rowNum + 1
        Else
            MsgBox "リクエストに失敗しました。ステータスコード: " & xmlhttp.Status
        End If
        
        ' オブジェクトの解放
        Set xmlhttp = Nothing
        Set stream = Nothing
        Set doc = Nothing
        
        On Error GoTo 0
    Next i
    
    Exit Sub
    
ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description
    On Error GoTo 0
End Sub



Sub ReadLocalHTMLFile()
    Dim filePath As String
    Dim htmlDoc As Object
    Dim title As String
    Dim h1 As String
    Dim ws As Worksheet
    Dim rowNum As Integer

    ' シートを設定
    Set ws = ThisWorkbook.Sheets("Sheet1")
    rowNum = 1 ' 開始行番号

    ' HTMLファイルのパスを設定
    filePath = "C:\path\to\your\file.html" ' ここにHTMLファイルのパスを指定

    ' HTMLファイルを読み取る
    Set htmlDoc = CreateObject("HTMLFILE")
    With htmlDoc
        .Open
        .Write GetFileContent(filePath)
        .Close
    End With

    ' タイトルとh1タグの内容を抽出
    On Error Resume Next
    title = htmlDoc.getElementsByTagName("title")(0).innerText
    h1 = htmlDoc.getElementsByTagName("h1")(0).innerText
    On Error GoTo 0

    ' 抽出した内容をExcelに転記
    ws.Cells(rowNum, 1).Value = "Title: " & title
    ws.Cells(rowNum, 2).Value = "H1: " & h1

    MsgBox "処理が完了しました。"

    ' オブジェクトの解放
    Set htmlDoc = Nothing
End Sub

Function GetFileContent(filePath As String) As String
    Dim fileContent As String
    Dim fileNumber As Integer
    Dim tempContent As String
    fileNumber = FreeFile

    On Error GoTo ErrorHandler

    ' ファイルを開いて内容を読み取る
    Open filePath For Input As fileNumber

    Do While Not EOF(fileNumber)
        Line Input #fileNumber, tempContent
        fileContent = fileContent & tempContent & vbCrLf
    Loop

    Close fileNumber

    GetFileContent = fileContent
    Exit Function

ErrorHandler:
    MsgBox "ファイルの読み取り中にエラーが発生しました: " & Err.Description
    Close fileNumber
End Function

Discussion