13

利用可能な Web サービス API がない場合、唯一のオプションは Screen Scrape かもしれませんが、C# でどのように行うのでしょうか?

どうやってやると思いますか?

4

6 に答える 6

14

マットとポールの答えは正しいです。Web サイトから HTML を解析することによる「スクリーン スクレイピング」は、通常、次の理由からお勧めできません。

  1. 特に不正な形式の場合、HTML の解析は困難になる可能性があります。非常に単純なページをスクレイピングしている場合は、正規表現が機能する可能性があります。それ以外の場合は、HTML Agility Pack などの解析フレームワークを使用してください。

  2. ウェブサイトは動く標的です。ソース Web サイトのマークアップ構造が変更されるたびに、コードを更新する必要があります。

  3. スクリーン スクレイピングは Javascript ではうまく機能しません。ターゲット Web サイトが何らかの動的スクリプトを使用して Web ページを操作している場合、それをスクレイピングするのは非常に困難です。HTTP 応答を取得するのは簡単ですが、その応答に含まれるクライアント側のスクリプトに応答してブラウザーが表示するものをスクレイピングするのは非常に困難です。

スクリーンスクレイピングが唯一の選択肢である場合、成功への鍵は次のとおりです。

  1. 探しているパターンをできるだけ簡単に変更できるようにします。可能であれば、パターンをテキスト ファイルまたはリソース ファイルとして保存します。他の開発者 (または 3 か月後の自分) が、どのようなマークアップを期待しているかを簡単に理解できるようにします。

  2. 入力を検証し、意味のある例外をスローします。解析コードでは、例外が非常に役立つように注意してください。ターゲット サイト変更された場合、コードのどの部分が失敗したかだけでなく、なぜ失敗したかをエラー メッセージで通知する必要があります。探しているパターンと比較対象のテキストの両方に言及してください。

  3. 自動化されたテストをたくさん書いてください。パターンを正しくするために多くの反復開発を行うため、非破壊的な方法でスクレイパーを非常に簡単に実行できるようにしたいと考えています。できる限り多くのテストを自動化してください。長期的には効果があります。

  4. Watinのようなブラウザ自動化ツールを考えてみましょう。ターゲット Web サイトとの複雑な対話が必要な場合は、HTTP 要求と応答を手動でいじるよりも、ブラウザー自体の観点からスクレイパーを作成する方が簡単かもしれません。

C# でスクレイピングをスクリーニングする方法については、Watin (上記を参照) を使用し、その DOM を使用して結果のドキュメントをスクレイピングするか、WebClientクラス [MSDN または Google を参照] を使用して、HTML を含む生の HTTP 応答を取得できます。次に、何らかのテキストベースの分析を使用して、必要なデータを抽出します。

于 2010-03-11T13:34:10.560 に答える
13

Html Agility Packを使用します。不十分で不正な形式の HTML を処理します。XPath を使用してクエリを実行できるため、探しているデータを簡単に見つけることができます。手でパーサーを書いたり、正規表現を使用したりしないでください。あまりにも不器用です。

于 2010-03-11T13:09:55.113 に答える
3

これはあなたを助けるサンプルC#コードです

Uri url = new Uri("http://msdn.microsoft.com/en-US/");
if (url.Scheme == Uri.UriSchemeHttp)
{
    //Create Request Object
    HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(url);
    //Set Request Method
    objRequest.Method = WebRequestMethods.Http.Get;
    //Get response from requested url
    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
    //Read response in stream reader
    StreamReader reader = new StreamReader(objResponse.GetResponseStream());
    string tmp = reader.ReadToEnd();
    objResponse.Close();
    //Set response data to container
    this.pnlScreen.GroupingText = tmp;
}
于 2012-05-10T11:14:08.610 に答える
3

あなたが探している用語は、実際にはスクリーンスクレイピングと呼ばれています。

Web サイトのスクレイピングについて考慮しなければならないことの 1 つは、スクレイピングは制御不能であり、頻繁かつ大幅に変更される可能性があるということです。スクレイピングを行う場合は、変更の事実を全体的な戦略の一部にする必要があります。たとえば、遅かれ早かれ「動くターゲット」に対処するためにコードを更新する必要があります。

開始するためのいくつかの C# リンクを次に示します。

http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx

于 2010-03-11T13:08:38.080 に答える
1

1 つだけ注意しなければならないのは、Web サイトを XML として取得し、XPath を使用してノードを反復処理することについて言及した人が何人かいるということです。XHTML で開発されたサイトで作業していることを確認して、HTML が整形式の XML ドキュメントを表していることを確認することがおそらく重要です。

于 2010-03-11T13:46:35.770 に答える