動かしては直す。効率ワルぅ。
タイマ駆動で、巡回リストの先頭のアドレスにNavigate()するようにした。
それだけだと、「戻る」リンクなどで、同じところをグルグル回るだけなので、巡回済みリストを作って、巡回済みのURLを記録するようにした。
巡回リストにAdd()するときに、リストにすでに存在したらAddしないパターン。
ただしこれだとURLの#fugaのフラグメントとかいう部分が異なると別アドレスとして認識してしまう。楽ちんなことに、UriのEquals()メンバはこのフラグメントやユーザ情報(user@の部分)を無視した比較をしてくれる。
これで軽く巡回させてみたところスクリプトエラーのダイアログが出て、Navigate()が失敗してうざいので、
WebBrowser.ScriptErrorsSuppressed=True
にしておくことにする。
DocumentCompleted()イベントはJavascriptでDOMを書き換えたりするとそのつど呼び出されるようだ。
なので、以下のような素朴な状態遷移管理では問題がある。
Navigate()呼び出し→状態変数を「読み込み完了待ち」に
DocumentCompleted()イベント→状態変数を「読み込み完了」に
どんな問題かというと、Javascriptによる処理の途中で次のNavigate()してしまうこと。
例:
でHTMLは同じなんだな。これが、こないだ書いた、
HTMLの内容もDocumentStreamからベタで保存できた。簡単な巡回キューも動いたので、あとちょっと。
だけどそれだと、Jvascriptで挿入されたDOM要素とかが保存されないんだよなぁ。
まじめにDOMをパースして文字列化するのが欲しい実装。
のこと。
ただし、バナーがAタグで実装されているかというと、必ずしもそうではありません。それでも見た目が違うのは間違いないので。
タイマーは数秒に設定して、のんびり巡回。
まだrobots.txtには対応していないから、そのうち怒られるのかも。
# だまってIPでフィルタされるのか。
hrefにHTMLでなくてファイルのURLを指定してNavigate()すると、WebBrowserコントロールは、DocumentStreamなどにスケルトン風のHTMLを勝手に格納するようだ。
そこにファイルの内容が入っているといろいろ楽なんだけれども。
# それだとDOMが解釈できないわな
コメント