数日間、私は WebBrowser ベースの webscraper に取り組んでいます。Threads および DocumentCompleted イベントを使用していくつかのプロトタイプを作成した後、単純で理解しやすい Webscraper を作成できるかどうか試してみることにしました。
目標は、実際の Thread オブジェクトを含まない Webscraper を作成することです。シーケンシャルなステップで動作するようにしたい (つまり、URL に移動する、アクションを実行する、他の URL に移動するなど)。
これは私がこれまでに得たものです:
public static class Webscraper
{
private static WebBrowser _wb;
public static string URL;
//WebBrowser objects have to run in Single Thread Appartment for some reason.
[STAThread]
public static void Init_Browser()
{
_wb = new WebBrowser();
}
public static void Navigate_And_Wait(string url)
{
//Navigate to a specific url.
_wb.Navigate(url);
//Wait till the url is loaded.
while (_wb.IsBusy) ;
//Loop until current url == target url. (In case a website loads urls in steps)
while (!_wb.Url.ToString().Contains(url))
{
//Wait till next url is loaded
while (_wb.IsBusy) ;
}
//Place URL
URL = _wb.Url.ToString();
}
}
私は初心者のプログラマーですが、これはかなり単純なコードだと思います。そのため、何らかの理由でプログラムがこのコードで NullReferenceException をスローするという事実を嫌います。
_wb.Url.ToString().Contains(url)
_wb.Navigate() メソッドを呼び出したので、NullReference を _wb オブジェクト自体に含めることはできません。したがって、私が想像できる唯一のことは、_wb.Url オブジェクトが null であることです。ただし、 while _wb.IsBusy() ループはそれを防ぐ必要があります。
では、何が起こっているのでしょうか。どうすれば修正できますか?