URLからMSXML2.XMLHTTPを用いてHTMLソースの取得するマクロを現在作成しています。
取得部分のつくりは以下のようになっております。
(必要最低限の記載になっております。)
Dim buf As String
Set Http = CreateObject("MSXML2.XMLHTTP")
Http.Open "GET", URL, False
Http.Send
buf = StrConv(Http.responseBody, vbUnicode)
上のようなコードでURLを取得しているのですが、
特定のサイト(URL)で正しく取得されないことがあります。
正しく取得できているかいないかの比較はChromeの「ページのソースを表示」から
ダウンロードしたものと比較して判断しています。
大体のURLではきれいに一致しているのですが
一部まったく違う形で取得されてしまい困っています。
どのように違うか詳細を記載できず大変申し訳ございません。
ただ差異の内容としては全く取得できないのではなく、
bodyタグの中身が取得されていなかったり、そもそも最初の記述が
Chromeでは「<!DOCTYPE html>」などから始まっているのに対して
自分が作成してたマクロでは「<?xml version="1.0" encoding="shift_jis"?>」のように
取得されていて全く異なる形で取得されていました。
何か原因がわかる方はいますでしょうか。
Html4かHtml5かで違うか考えたのですがそうでもなさそうなので
何かわかる方がいましたらお願いいたします。
@追記 2019/10/7
どのような状況かわかりやすくするため実際のソースを一部情報を隠して記載します。
情報を隠すため「*」を入れとても分かりにくくなっているかと思われますがご了承ください。
・Chromeから取得したソース
→そのままです。Chromeからソースの表示で取得したものになります。
長いため色々と省略しています。
<!DOCTYPE html>
<html lang="ja">
<head prefix="*****">
<meta charset="Shift_JIS"/>
<meta http-equiv="***" content="IE=edge,chrome=1" />
<title>****</title>
<meta name="***" content="***" />
<meta http-equiv="***" content="text/javascript" />
<link rel="***" href="***" />
~~~~~
<link rel="stylesheet" href="***" media="all" />
<script src="***.js"></script>
~~~~~
<script src="***.js" charset="Shift_JIS"></script>
</head>
<body id="***" class="***">
<div class="***">
<div class="***">
<div class="***">
<div class="***">
<ol>
<li><a href="/">***</a></li>
<li><a href="***">***</a></li>
<li><a href="***">***</a></li>
<li><a href="***">***</a></li>
<li>***</li>
</ol>
</div>
</div>
<div class="***">
<div class="***">
<h1>***</h1>
</div>
</div>
***省略***
</div>
</div>
</div>
</div>
<script type="text/javascript" src="***"></script>
</body>
</html>
・問題のソース
→今回作成したマクロで取得した物の中で問題のソースになります。
こっちのほうでは省略などはしてありません。これしか取得されないので困っています・・・
<?xml version="1.0" encoding="shift_jis"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "***">
<html xmlns="***/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<meta http-equiv="***" content="IE=edge,chrome=1" />
<title>***</title>
<meta http-equiv="***" content="0;URL=***/" />
<link rel="***" href="***" />
</head>
<body>
<script type="text/javascript" src="***"></script>
</body>
</html>
うまくいっているのものはWinMargeで比較しても綺麗に一致しているのですが
問題のものは全く違う形で取得されてしまいます。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
リクエストの UA や Accept 等でレスポンスを変えることはあります。
https://developer.mozilla.org/ja/docs/Web/HTTP/Content_negotiation
HTML5 を XHTML にする理由はわかりかねますが、コンテンツがそもそも来ないというのはログインが必要なサイトだったりしませんか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
ソース中にJavaScriptなどの制御文が含まれていませんか?
XMLHTTPで得られるのはサーバが通知したHTTPレスポンスそのものです。
そのソース中に動的に自分自身を書き換えるような制御文(たとえばJavaScriptや
meta文によるジャンプなど)があっても動作しません。
これに対しIEやchromeで参照できるのは、(場合によりますが)それらの制御文の
処理が完了した後のソースとなります。
したがって、それらの制御文が含まれるページでは、ソースが異なる可能性が
あります。
これを調べるのに簡単なのは、
ネットワークアナライザ(Wireshark等)により、実際に流れるコンテンツを観測
することです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.11%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2019/10/07 14:18
返信が遅れて申し訳ございません。
>リクエストの UA や Accept 等でレスポンスを変えることはあります。
同じURLでも振る舞いが変わってくるっていうことですね。
Acceptに関してはわかりませんが、UAに関しては同じコードで取得をしているので
変わりはなさそうに思えます。。。
>HTML5 を XHTML にする理由はわかりかねますが、コンテンツがそもそも来ないというのはログイン>が必要なサイトだったりしませんか?
特にログインしなければ見れないという画面ではないです。
完全にレスポンスがかえって来ないというわけではなく帰っては来るのですが
直接「ページのソースを表示」で取得した時と大きく異なる感じですね・・・
完全な詳細は記載することができないのですがもう少しわかりやすい例を追記します。
2019/10/07 15:13
本当のアドレスはそちらです。
https://developer.mozilla.org/ja/docs/Web/HTTP/Redirections#HTML_redirections
2019/10/07 17:11
リダイレクトには気づきませんでした。
今回問題のソースでは互換表示の設定?をしているようですが、
この表記正しく取得されるソースにも記載されていました。
同じマクロで同じ条件下で取得しているのでブラウザなどの違いではなさそうです。。。
どこかにリダイレクトしているわけではなさそうに見受けられるのですが、
当方あまりHTML、JavaScriptに詳しくないので間違っているかもしれないです。
実はどこかにリダイレクトしているのでしょうか。。。
2019/10/08 11:06
共通して正しく取得されないページはリダイレクトされていることになかなか気づけませんでした。
ありがとうございます。
ただリダイレクト前のソースを取得することはできるのでしょうか・・・
2019/10/08 11:17
ほしい情報がなく「これしか取得されないので困っています」とのことなので、リダイレクト後のほうを取得したらいいのではないですか?