Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 8.1 Pro : Excel 2013)
oHttp.responseTextとMicrosoft Edgeの「ページのソース表示」と内容が違う理由
投稿日時: 21/08/04 07:01:34
投稿者: sucer

以前投稿した質問の続きです。
 
Sub GetResponseTxt_質問用()
 
 
Dim oHttp As Object
Dim fso As Scripting.FileSystemObject
Dim FSOText As Scripting.TextStream
 
 
Dim Strコード As String
Dim URL As String
Dim strText元 As String
 
 
Set oHttp = CreateObject("MSXML2.XMLHTTP")
 
Set fso = CreateObject("Scripting.FileSystemObject")
 
Set FSOText = fso.OpenTextFile(ThisWorkbook.Path & "\MsgLog.txt", ForAppending, False, TristateTrue)
 
 
 URL = "https://us.kabutan.jp/stocks/VOO"
                  
    With oHttp
              
         .Open "GET", URL, False
         .send
      
         If (.Status < 200 Or .Status >= 300) Then
             End
              
         End If
             '元データの取得
             strText元 = .responseText
              
    End With
             
FSOText.Write (strText元)
 
FSOText.Close
 
Set oHttp = Nothing
Set fso = Nothing
Set FSOText = Nothing
 
 
End Sub
 
 
https://us.kabutan.jp/stocks/VOOの「ページのソース表示」にはpr-2px pb-2px pl-2pxのキーワードがあるのにFSOText.Write (strText元)で作成したMsgLog.txtにはそのキーワードが存在しません。
 
「ページのソース表示」はUTF-8でMsgLog.txtはUnicodeですがMsgLog.txtに文字化けはありませんでした。
 
 MsgLog.txtの内容とMicrosoft Edgeでhttps://us.kabutan.jp/stocks/VOOの「ページのソース表示」との内容が違うのはなぜでしょうか?
 
 分かる方おられましたら教えてください。
 
 よろしくお願いします。

回答
投稿日時: 21/08/04 11:44:02
投稿者: Suzu

XMLHTTP は、サーバーからのHTML そのものを取得しますが、
 HTML には、動的に自身を書き換えるものや、リダイレクト処理をふくむものがあります。
 
ブラウザでは、その部分の処理を行い、最終的な表示を行います。
対し、XMLHTTP は その様な処理を行いません。
 
よって、違いが出てくる場合があります。

投稿日時: 21/08/04 20:31:02
投稿者: sucer

Suzuさん、返信ありがとうございます。
 
そのようなケースの場合はXMLHTTP以外のObjectを使うしかないのでしょうか?
 
objIE以外にどんなObjectを使えばEdgeのソースと同じになるのでしょうか?
 
分かる方おられましたら教えてください。
 
よろしくお願いします。
 

回答
投稿日時: 21/08/04 22:40:06
投稿者: simple

PCに切り替えるボタンが表示されたりしているので、キャリアの判定がどうなっているのか、
よくわかりませんね。
スクレイピングへの自衛措置なんでしょうか、
内容もグラフが無いなどの対応になっていますね。
 
SeleniumBasicを使って、Chromeを使ってアクセスする例を載せてみます。

Sub test()
    ' 参照設定 Selenium Type Library
    '          Microsoft ActiveX Data Objects 6.1 Library(6.1は古いかも)
    
    Dim driver As Selenium.WebDriver
    Dim stm As Object
    Dim url As String
    Dim strSource As String

    Set driver = New Selenium.WebDriver

    url = "https://us.kabutan.jp/stocks/VOO"
    driver.Start "chrome", url
    driver.Get "/"

    ' ページソースの取得
    strSource = driver.PageSource()

    'ファイル書き込み
    Set stm = CreateObject("ADODB.Stream")
    With stm
        .Open
        .Type = adTypeText
        .Charset = "UTF-8"
        .WriteText strSource
        .Position = 0
        .Savetofile "test.htm", adSaveCreateOverWrite
        .Close
    End With
    Set stm = Nothing
    Set driver = Nothing
End Sub

SeleniumBasicの使い方についてはネットでお調べください。
 

回答
投稿日時: 21/08/05 17:43:32
投稿者: simple

"キャリア"の判定というのは用語が変でした。
"デバイス"(PCなのか携帯なのか等)の判定というべきでした。
(User_Agentヘッダで判定できるのか不明でしたし、PCでアクセスした私を
 携帯からアクセスと誤判定しているので、たまたまの結果と考えるのが自然な気がします。)
 
Edgeをご希望のようですが、
最新のEdgeは骨格部分がchrome技術に依存していたり、
chromeのシェアの高さから、chromeの使用を推奨しました。
 
どうしてもEdgeということであれば、
https://www.moug.net/faq/viewtopic.php?t=80714
で紹介した記事が、SeleniumBasicからEdgeを操作する際の参考になるものと思います。
トライしてみてください。(ちなみに、私は実行したことがありません。必要性を感じていないので)

投稿日時: 21/08/05 20:18:03
投稿者: sucer

simpleさん、返信ありがとうございます。
 
私、会社員でして時間がある程度取れるのは土日だけです。
 
教えていただいた内容を参考に土日に挑戦してみたいと思います。
 
今回の質問はいったん解決にします。
 
また不明な点があったら質問するかもしれませんので皆さんよろしくお願いします。