1

私は分で小さな自動化プロジェクトに取り組んでいて、レンガの壁にぶつかりました。まず、プロジェクトのこのコンポーネントにWebブラウザーを使用している唯一の理由は、スクレイピングされているサイトのコードが難読化されており、コードを表示するためにJava対応のブラウザーが必要なことです。Webクライアントを使用して機能する別のアプリがあります。他のテストサイトでは問題ありませんが、残念ながらこのターゲットでは使用できません

私の問題は、Webブラウザコントロールをプログラムで構成しようとすると発生します

私が発見した最初の問題は、コントロールのプロパティでURLを手動で設定すると、ページ1が読み込まれ、スクレーパーがそのページで機能することです。
ただし、プロパティでURLをクリアし、Form1_Loadメソッドで手動で設定しましたが、プルされた自動パラメーターが正常であり、問​​題なく設定されていることを確認したにもかかわらず、URLとしてabout:blankが返されます。

これが私が使っているものです:

注:
コレクションとは、XMLでシリアル化された定義の配列を指します
。定義とは、このターゲットのアクティブな定義を指します。これは、複数のターゲットに対して構成することを目的としています。

    private void Form1_Load(object sender, EventArgs e)
    {
        PopulateScraperCollection();
        webBrowser1.Url = new Uri(collection.ElementAt(b).AccessUrl);
        NavigateToUrl(collection.ElementAt(b).AccessUrl);
    }

    public void PopulateScraperCollection()
    {
        string[] xmlFiles = Directory.GetFiles(@"E:\DealerConfigs\");
        foreach (string xmlFile in xmlFiles)
        {
            collection.Add(ScraperDefinition.Deserialize(xmlFile));
        }
    }

    public void NavigateToUrl(string url)
    {
        Console.WriteLine(collection.ElementAt(b).AccessUrl);
        webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
        webBrowser1.Navigate(webBrowser1.Url);
    }

    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser wb = sender as WebBrowser;
        Process(collection.ElementAt(b), 0);
        b++;
    }

その結果、これにより、DocumentCompletedを使用してページ分割された結果に移動する際に別の問題が発生します。最初のページの読み込みで、DocumentCompletedイベントを使用してリンク抽出をトリガーします。
xpathを使用して正常に選択され、再度検証されている次のページのURLを設定しようとすると、F10を使用してデバッグをステップオーバーすると、変更されておらず、DocumentCompletedイベントがトリガーされていないことが示されます。

URLなどを変更するための私のコードは次のとおりです。

string nextPageUrl = string.Format(definition.NextPageUrlFormat, WebUtility.HtmlDecode(relativeUrl));
webBrowser1.Url = new Uri(nextPageUrl);
webBrowser1.DocumentCompleted += webBrowser1_DocumentCompleted;
webBrowser1.Navigate(webBrowser1.Url);

いつものようにどんな助けでも大歓迎です、これは自動化するのに悪夢であることが証明されています、なぜならWebBrowserはWebClientよりもはるかに遅いだけでなく、その場で変更するのが苦痛であることを証明しているからです

よろしく

バリー

4

1 に答える 1

1

You should never really set webBrowser1.Url, You should just be using the Navigate void, so

private void Form1_Load(object sender, EventArgs e)
{
    PopulateScraperCollection();
    NavigateToUrl(collection.ElementAt(b).AccessUrl);
}

My guess would be why it isnt navigating, is that the collection.ElementAt(b).AccessUrl is null or about:blank

Im not really sure how to answer your question, but the Navigate void should change it

NB: WebBrowser control is proper crap, you could try another WebBrowser control like Awesomium or GeckoFX

于 2012-07-23T11:44:35.893 に答える