質問

利用可能な Web サービス API がない場合、唯一の選択肢は画面スクレイピングかもしれませんが、C# ではどうすればよいでしょうか?

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

役に立ちましたか?

解決

マットとポールの答えは正しいです。Web サイトから HTML を解析する「画面スクレイピング」は、通常、次の理由から悪い考えです。

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

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

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

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

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

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

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

  4. ブラウザ自動化ツールを検討する のように ワティン. 。ターゲット Web サイトとの複雑な対話が必要な場合は、HTTP リクエストとレスポンスを手作業でいじるよりも、ブラウザ自体の観点からスクレイパーを作成する方が簡単かもしれません。

はどうかと言うと どうやって C# でスクリーン スクレイピングするには、Watin (上記を参照) を使用し、その DOM を使用して結果のドキュメントをスクレイピングするか、 WebClient クラス [MSDN または Google を参照] を使用して、HTML コンテンツを含む生の HTTP 応答を取得し、ある種のテキストベースの分析を使用して必要なデータを抽出します。

他のヒント

Htmlの敏捷性パックを使用してください。それは悪いと不正なHTMLを処理します。それはあなたが探しているデータを検索するために、それは非常に簡単になって、あなたは、XPathを照会することができます。それはあまりにも不器用だし、手でパーサを書いていないと、正規表現を使用しないでください。

あなたが探している用語は、実際の画面スクレイピングと呼ばれている。

あなたがウェブサイトをスクレイピングについて考慮しなければならないことの一つは、彼らがあなたのコントロールを超えていると、頻繁かつ大幅に変えることができるということです。あなたが変更の事実をこすると行く場合は、あなたの全体的な戦略の一環べきです。例えば。あなたがに対処するために、遅かれ早かれ、あなたのコードを更新する必要があります「動く標的。」

ここでは、あなたが始めるためにC#のリンクのカップルです

<のhref = "http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx" rel = "nofollowをnoreferrer"> http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx

ここであなたを助けるサンプル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;
}
注意すべき

ただ一つのこと、少数の人々は、XMLとしてのウェブサイトをプルダウンして、ノードを反復処理するXPathを使用して言及しています。それはあなたがHTMLがうまく形成されたXML文書を表していることを確認するために、XHTMLに開発されたサイトで作業していることを確認するために、おそらく重要です。

実用的な観点から(私は長年にわたって、「ウェブ・インタラクティブ」アプリケーションの数十を書かれている)、私は最終的に Watin <上定住/ A> CSQuery を組み合わせる。

CSQueryができますしながら、

Watinは、ページの内容を解析するためにjQueryのスタイルの構文を使用して、ブラウザの自動化(ボタンなどとの相互作用)の基礎を提供します。

私はIEとFirefoxで(また、ウェブサイトの自動テストのために設計された)しばらくの間、セレンを使用し、それは長期的なスクレイピングのために使用されたときにクラッシュしがちであることが判明しました。すべての私の現在の生産システムは、Watin + CSQueryであり、日常的に複数のWebサイトの信頼性のスクレイピングを提供します。

注: "それは、それを使用し、壊れていない場合は!" 私はWatinはしばらく更新されていない実現が、:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top