2

C#ウィンドウフォームでWebスクレイパーを開発したいと思っています。私が達成しようとしていることは次のとおりです。

  1. ユーザーからURLを取得します。
  2. WINFormsのIEUIコントロール(埋め込みブラウザ)にWebページをロードします。
  3. ユーザーがテキストを選択できるようにします(連続、小さい(50文字を超えない))。ロードされたWebページから。
  4. ユーザーが場所(HTML DOMの場所)を永続化する場合は、DBに永続化する必要があります。これにより、ユーザーはその場所を使用して、次回のアクセス時にその場所のデータをフェッチできます。

ロードされたWebサイトが価格表サイトであり、見積もりレートが変化し続けると仮定すると、次回トラバースできるようにDOM階層を永続化するというアイデアがあります。

すべてのHTML要素にid属性があれば、これを行うことができます。idがnullの場合、これを実行できません。

誰かがこれについて有効なアイデアを提案できますか(可能であれば最小限のコードスニペット)?

あなたがいくつかのオンラインリソースを共有することができるとしても、それは役に立ちます。

ありがとう、

ビジェイ

4

2 に答える 2

2

1つのアプローチは、選択する要素までタグ/スタイル/IDのスタックを構築することです。

必要な要素から、最も近いid要素までトラバースします。このようにして、トップヘッダーなどのほとんどを取り除くことができます。次に、検索するシーケンスを作成します。

例:

<html>
  <body>
    <!-- lots of html -->
    <div id="main">
       <div>
          <span>
             <div class="pricearea">
                <table> <!-- with price data -->

たとえば、データベースに次のシーケンスを格納します:[id = main]、div、span、div、tableまたはおそらくdiv [class = pricearea]、table

スタイル/クラスの使用もパスの作成に使用される場合があります。タグ、タグの属性、または組み合わせのいずれかを探すのはあなたの選択です。堅牢にするために、要素をできるだけ少なくして、できるだけ正確にする必要があります。

レイアウトがめったに変更されない場合は、毎回同じ場所に移動できます。

また、IEコントロールが遅いため、DOM解析にはHTMLAgilityPackなどを使用することをお勧めします。

画面のスクレイピングは楽しいですが、すべてのページで100%取得するのは困難です。幸運を!

于 2010-01-23T08:57:20.437 に答える
0

少しグーグルした後、私はかなり単純な解決策に遭遇しました。以下にサンプルスニペットを添付します。

if (webBrowser.Document != null)
        {
            IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;// loads the HTML DOM
            IHTMLSelectionObject selection = HtmlDoc.selection;// Fetches the currently selected HTML Element.
            IHTMLTxtRange range = (IHTMLTxtRange)selection.createRange();
            IHTMLElement parentElement = range.parentElement();// Identifies the parent element
            targetSourceIndex = parentElement.sourceIndex;               
            //dataLocation = range.parentElement().id;                
            MessageBox.Show(range.text);//range.parentElement().sourceIndex
        }

Winformsアプリケーションで埋め込みWebブラウザーを使用しました。これは、現在のWebページのHTMLDOMをロードします。

IHTMLElementインスタンスは、各html要素に一意のIDを割り当てる「SourceIndex」という名前のプロパティを公開します

このSourceIndexをDBに保存し、その場所のコンテンツを照会できます。次のコードを使用します。

if (webBrowser.Document != null)
            {
                IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;
                IHTMLElement targetElement = null;
                foreach (IHTMLElement domElement in HtmlDoc.all)
                {
                    if (domElement.sourceIndex == int.Parse(node.InnerText))// fetching the persisted data from the XML file.
                    {
                        targetElement = domElement;
                        break;
                    }
                }

                MessageBox.Show(targetElement.innerText); //range.parentElement().sourceIndex
            }
于 2010-02-09T04:48:35.080 に答える