[[20201029220615]] 『vbaでHTMLソース取得する最適なコード教えて下さax(ナナ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『vbaでHTMLソース取得する最適なコード教えて下さい』(ナナ)

現在、インターネットから情報を取得するためのマクロを作成しています。

当初は、IE操作を行い情報を取得していました。
しかし、IE操作だと読み込みまでに時間がかかった、高速化できる方法を調べていたところ、下記のサイトでHTMLソースが取得できると知りました。

こちらのサイトに掲載されているコードを使用して、HTMLソースを取得し、情報を取得できるようになったのですが、大量のページを巡回する際、HTMLソースが取得できなくなりました。
デバックして確認したところ、ウォッチ式でresponsetextの値に『リソース不足で操作が完了できませんでした』と表示されていました。

また、objDoc.write objHtml.responseTextの部分の仮想メモリの消費が3MBでした。こちらのコードより最適なコードもしくはよい修正案ありましたら宜しくお願いします。

URL
https://rabbitfoot.xyz/vba-programming-read-htmlsrc/
コード
Public Function getHtmlDoc(url As String) As Object

    Dim objHtml As Object       'サイトデータの格納先
    Dim objDoc As Object        'ドキュメントの格納先

    'XMLHTTPオブジェクトを生成
    Set objHtml = CreateObject("MSXML2.XMLHTTP")

    On Error Resume Next
    Call objHtml.Open("GET", url, False)
    Call objHtml.send

    'ロード完了まで待つ
    Do While objHtml.readyState <> 4
        Sleep 100
        DoEvents
    Loop

    'DOM操作を行える様にする
    Set objDoc = CreateObject("htmlfile")
    Call objDoc.write(objHtml.responseText) ←-------ココ

    Set getHtmlDoc = objDoc
End Function

< 使用 Excel:Excel2013、使用 OS:Windows10 >


ローカルウインドウで、
objHtmlのresponseTextプロパティを見てください。
どうなっていますか?
サーバーが返してくるメッセージなので、その科白(せりふ)は妙です。

ちなみに、
Call objHtml.Open("GET", url, False) の
最後のFalseは非同期通信をFalseにする(つまりは、同期通信にする)ので、
処理が終了してレスポンスを返すまで待ちます。
また、勝手に進むことはありませんので、
処理待ちのコード等の処理は不要です。

(γ) 2020/10/29(木) 23:42


 On Error Resume Next を消して、
 実行時エラーが発生してないかどうか確認してください。
 デバッグ時にエラー無視してちゃだめでしょう
(とおりすがり) 2020/10/30(金) 10:43

 ああ、そういうことか。ご指摘のとおりですね。
 大量のページと言うところを読み飛ばしていました。
 エラー無視して暴走していたのか。

 別のところで質問しているかたと同じ人ですか?
 コード全体を示してもらうといいですが、
 例えば同一サイトに繰り返しアクセスしたりしていませんか?

 エラーが発生しても無限に繰り返しをしたりすれば、
 資源を食い尽くすこともあるでしょう。
 こういうことはやめたほうがよい。
 大量のアクセスなどはしないこと。
 ある程度、分割して実行すること。

 少なくとも、status(return code)が200であるかぐらいはチェックしたうえで、
 不要な後続処理は割愛するなどの工夫をすべきです。

 なお、一定のアクセス間隔をとることも必要です。
 相手サーバーに負荷がかかり、障害が発生する懼れもあります。
 岡崎図書館事件というのが有名ですが、
 繰り返しアクセスしたために逮捕されたという事件もありました。
 図書館側のシステムの不備があり、責任は一方的にユーザー側では
 ありませんでしたが、そうした事態を起こす懸念はあります。

 こうしたスクレイピングには、サーバー側で自衛措置を執って
 アクセスを拒否することもあります。

(γ) 2020/10/30(金) 13:08


 暴走し始める前に、getHtmlDocがNothingになり始めた時点があると思うんですが、
 その時どういう処理をしているのかが問題ですね。

 多分、ループで何回もgetHtmlDocを取得させに行っているんでしょうが、
 相手サーバーが拒否し始めたなら永遠に取れないし、
 物理的に取り損なっているとしても、10回もやってだめなら諦めるしかないと思う。

 と言うことで、10回(回数は目途)やってだめなら、
 そのサイトは諦めるようなコーディンが無難じゃないですか?

 技術的な話はさて置き、逮捕の恐れなんて事も考慮すると、
 相手サーバーのスクレイピングに対する見解を確かめて置いた方がいいでしょうね。

(半平太) 2020/10/30(金) 23:14


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.