Webスクレイピングと.Net

最近、ウェブスクレイピング(ウェブマイニング)に興味があり、その結果、既に存在することを聞いたことがあるがまだ試していない人のために記事を書くことにしました。





したがって、私の理解では、Webの破棄自体は、HTMLページの形式でインターネットに投稿されたデータを何らかのストレージに転送することです。 ストレージは、プレーンテキストファイル、XMLファイル、またはデータベース(DB)のいずれかです。 つまり、リバース(リバース)プロセスは明らかです。結局のところ、Webアプリケーションは通常、データベースからデータを取得します。



理論から実践へ



例として、単純なケース-サイトauto.ruのページの分析を取り上げます。 リンクhttp://vin.auto.ru/resolve.html?vin=TMBBD41Z57B150932をたどると、識別番号TMBBD41Z57B150932(製造、モデル、修正など)に対して表示される情報が表示されます。 この情報をウィンドウ(Windowsベースのアプリケーションなど)に表示する必要があるとします。 .Netでのデータベースの操作は広く説明されているため、この問題に焦点を当てるのではなく、本質に焦点を当てます。

したがって、WinFormsアプリケーションプロジェクトを作成し、アドレス(リンク)が書き込まれるtbTextという名前のTextBoxコンポーネントを1つドロップします。 btnStartボタンをクリックすると、指定されたアドレスでリクエストが実行され、ListBox lbConsoleで受信データが取得されます。 実際のアプリケーションでは、リンクも外部ソースから取得する必要がありますが、これは単なる例であることを忘れないでください。



画像



実際にすべてのインターフェイスを使用して、ボタンのクリックに応答して呼び出されるメソッドを作成します。



この方法では、次のことを行う必要があります。

1. TextBoxで提供されているアドレスに連絡する

2.ページを取得する

3.ページから必要なデータを選択します

4.フォームにデータを表示する



私たちは対処しています



最初に、リクエストによって受信されたページが保存される変数を作成します。



string AutoResult = String .Empty; * This source code was highlighted with Source Code Highlighter .



  1. string AutoResult = String .Empty; * This source code was highlighted with Source Code Highlighter .



string AutoResult = String .Empty; * This source code was highlighted with Source Code Highlighter .







次に、既知のリンクをパラメーターとして渡すことにより、リクエストを作成します。







  1. var autoRequest =(HttpWebRequest)WebRequest.Create(tbLink.Text);
*このソースコードは、 ソースコードハイライターで強調表示されました。




リクエストプロパティを設定します。これらは、ブラウザとして自分自身を偽装するのに役立ちます。 この場合、これは重要ではありませんが、一部のサイトはリクエストヘッダーを分析するため、これは将来の手がかりになります。







  1. autoRequest.UserAgent = "Mozilla / 4.0(互換性あり; MSIE 8.0; Windows NT 5.1; Trident / 4.0)" ;
  2. autoRequest.Headers.Add( "Accept-Language""ru-Ru" );
  3. autoRequest.Accept = "image / gif、image / jpeg、image / pjpeg、image / pjpeg、application / x-shockwave-flash、application / x-ms-application、application / x-ms-xbap、application / vnd.ms -xpsdocument、application / xaml + xml、application / vnd.ms-excel、application / vnd.ms-powerpoint、application / msword、* / * " ;
*このソースコードは、 ソースコードハイライターで強調表示されました。




また、GETメソッドが使用されることを示します。







  1. autoRequest.Method = "GET" ;
*このソースコードは、 ソースコードハイライターで強調表示されました。




これでリクエストが完了し、次のアイテムに進みます-



取得ページ







  1. HttpWebResponse autoResponse =(HttpWebResponse)autoRequest.GetResponse();
*このソースコードは、 ソースコードハイライターで強調表示されました。




実際、サーバーの応答、したがってページ自体は、autoResponse変数に格納されています。 ここで、この答えを分析する必要があります。すべてが問題なければ、ページを文字列として表示できます。







  1. if (autoResponse.StatusCode == HttpStatusCode.OK)
  2. {
  3. 使用Stream autoStream = autoResponse.GetResponseStream())
  4. {AutoResult = new StreamReader(autoStream、 Encoding .GetEncoding( "windows-1251" ))。ReadToEnd(); }
  5. }
*このソースコードは、 ソースコードハイライターで強調表示されました。




そして、すべてが本当に正常であれば、AutoResult変数に同じタイプの行があり、「ページソース」メニューを使用してブラウザーで見ることができます。 まあ、おそらくフォーマットされていない形式です。



もちろん、これは素晴らしいことです。 しかし、この大量のタグから必要なものを正確に選択したいと思います。 ここでは、エキスパンダーメソッドを使用して使用する正規表現が役立ちます。 リマインダーメソッドは、このクラスのこのオブジェクトがキーワードthisでマークされた静的クラスのメソッドの最初のパラメーターである場合、別のクラスのオブジェクトのメソッドとして呼び出すことができる静的クラスの静的メソッドです。 この例は簡単です。 StringOperationsクラスのStringWithEqメソッドがある場合







  1. 静的 クラス StringOperations
  2. { 内部 静的 文字列 StringWithEq( この 文字列 s){ 文字列を返す.Format( "{0} =" 、s);}}
*このソースコードは、 ソースコードハイライターで強調表示されました。




このメソッドは、通常の方法(1)とエキスパンダーメソッド(2)の両方で使用できます。







  1. 文字列 test = "Test" ;
  2. (1) Console .Write(StringOperations.StringWithEq(テスト));
  3. (2) Console .Write(test.StringWithEq());
*このソースコードは、 ソースコードハイライターで強調表示されました。




ブラウザでHTMLページのソースコードを見ると、必要なデータが他のどこでも使用されていないタグ内に含まれていることがわかります。



<dl class="def-list md"><dt><strong> </strong></dt><dd>TMBBD41Z57B150932</dd><dt><strong></strong></dt><dd>SKODA</dd><dt><strong></strong></dt><dd>Octavia II (A5)</dd><dt><strong></strong></dt><dd>Elegance</dd><dt><strong> </strong></dt><dd>2007</dd><dt><strong> </strong></dt><dd></dd><dt><strong> </strong></dt><dd>5-</dd><dt><strong> , ..</strong></dt><dd>2000</dd><dt><strong> </strong></dt><dd>150</dd><dt><strong> </strong></dt><dd>BLR, BLX, BLY</dd><dt><strong> </strong></dt><dd> </dd><dt><strong> </strong></dt><dd>Solomonovo</dd><dt><strong> </strong></dt><dd></dd><dt><strong> </strong></dt><dd></dd><dt><strong></strong></dt><dd>Skoda Auto as</dd><dt><strong> </strong></dt><dd>50932</dd><dt><strong> </strong></dt><dd><span style='color: #FF0000;'>NOT OK!</span></dd></dl> - <a href="http://vinformer.su">vinformer.su</a></div>







したがって、これを利用して、まずこのタグ内からデータを抽出し、次にそれを解析して、たとえばDictionaryクラスのオブジェクトに配置します。 その後、受信したデータをListBox lbConsoleに表示します。 最終的なコードを次のようにしたいと思います。







  1. string BetweenDL = AutoResult.BetweenDL();
  2. 辞書< stringstring > d = BetweenDL.BetweenDTDD();
  3. foreach (dのvar s)
  4. {
  5. lbConsole.Items.Add( string .Format( "{0} = {1}" 、s.Key、s.Value));
  6. }
*このソースコードは、 ソースコードハイライターで強調表示されました。




最初の行では、必要なデータを含む行を取得します。 ここでは、この種のエキスパンダーメソッドを使用します。







  1. 内部 静的 文字列 BetweenDL( この 文字列 dumpFile)
  2. {
  3. var _regex = new Regex( @ "<dl [^>] *>(?<value> [\ s \ S] +?)</ dl>" 、RegexOptions.IgnoreCase | RegexOptions.Compiled);
  4. Match _match = _regex.Match(dumpFile);
  5. return _match.Success? _match.Groups [ "value" ] .Value: string .Empty;
  6. }
*このソースコードは、 ソースコードハイライターで強調表示されました。




次に、別のエクステンダーメソッドを使用して、必要なデータを選択し、Dictionaryクラスのオブジェクトに書き込みます。







  1. 内部 静的辞書< stringstring > BetweenDTDD( この 文字列 dumpFile)
  2. {
  3. var _regex = new Regex( @ "<dt [\ s \ S] +?strong>(?<valDT> [\ s \ S] +?)</ strong> </ dt> <dd [^>] *> (?<valDD> [\ s \ S] +?)</ dd> " 、RegexOptions.IgnoreCase | RegexOptions.Compiled);
  4. MatchCollection matches = _regex.Matches(dumpFile);
  5. 辞書< 文字列文字列 > d = 新しい辞書< 文字列文字列 >();
  6. foreach (マッチのマッチマッチ)
  7. {
  8. GroupCollection groups = match.Groups;
  9. d.Add(groups [ "valDT" ] .Value、groups [ "valDD" ] .Value);
  10. }
  11. return d;
  12. }
*このソースコードは、 ソースコードハイライターで強調表示されました。




次に、foreachループで、結果のデータをListBoxに表示します。



画像



もちろん、2番目のエキスパンダーメソッドのみを使用できますが、結果は同じになります。 実際のアプリケーションでは、必要なデータを含むテキストの一部を選択し、その分析を行う方が便利な場合があります。 このコードには他の改善や変更を加えることができますが、私が達成したこの短い記事の目標は、Webスクレイピングとは何かを理解することです。




All Articles