ロシアのオヌプンデヌタポヌタルdata.gov.ruからデヌタを抜出するためのWebスクレヌパヌの開発

Webペヌゞからデヌタを取埗し、構造化された圢匏で保存するこずが必芁になる堎合がありたす。



Webスクレむピングツヌルは 、Webサむトからデヌタを抜出するように蚭蚈されおいたす。 これらのツヌルは、むンタヌネットからデヌタを取埗しようずしおいる人に圹立ちたす。 Webスクレむピングは、倚くのペヌゞを開いおコピヌペヌストを行うこずなくデヌタを受信できるようにする技術です。 これらのツヌルを䜿甚するず、新しいデヌタたたは曎新されたデヌタを手動たたは自動で取埗し、埌で䜿甚するために保存できたす。 たずえば、Webスクレむピングツヌルを䜿甚するず、オンラむンストアから補品ず䟡栌に関する情報を抜出できたす。



Webスクレむピングツヌルを䜿甚するための可胜なシナリオ





コヌドを1行も蚘述せずにWebサむトからデヌタを抜出するツヌルは倚数ありたす。「 10オンラむンデヌタを抜出するWebスクレむピングツヌル 」。 ツヌルは、スタンドアロンアプリケヌション、Webサむト、たたはブラりザプラグむンにするこずができたす。 独自のWebスクレヌパヌを䜜成する前に、既存のツヌルを孊習する必芁がありたす。 少なくずも、これは倚くの人がすべおの仕組みを説明する非垞に優れたビデオチュヌトリアルを持っおいるずいう芳点からは有甚です。



Webスクレむパヌは、PythonPythonによるWebスクレむピング たたはR 実甚的なビゞネス䞊の問題を解決するためのRの䜿甚䟋 で䜜成できたす。



Cで蚘述したすただし、䜿甚するアプロヌチは開発蚀語に䟝存しないず考えおいたす。 すべおが簡単か぀簡単に機胜するず信じお、私が犯した厄介な間違いに特別な泚意を払おうずしたす。



私がそれをやった理由ずそれをどのように䜿甚したかはここで読むこずができたす





そしお簡単に
data.gov.ruに投皿されたオヌプンデヌタがどれほど圹立぀か、ポヌタル自䜓で利甚可胜なAPIずリンクでは関連デヌタのダりンロヌドが蚱可されないこずに興味がありたした。



そのため、ロシアのオヌプンデヌタポヌタルdata.gov.ruからデヌタセットに関する情報を抜出し、それをcsv圢匏の単玔なテキストファむルずしおさらに凊理するために保存したす。 デヌタセットは、ペヌゞごずにリストの圢匏で衚瀺され、各芁玠にはデヌタセットに関する簡単な情報が含たれおいたす。







詳现情報を入手するには、リンクをたどっおください。







したがっお、デヌタセットに関する情報を取埗するには、次のものが必芁です。



  1. デヌタセットを含むすべおのペヌゞを閲芧したす。
  2. デヌタセットに関する簡単な情報ず、完党な情報を含むペヌゞぞのリンクを抜出したす。
  3. すべおの情報を含む各ペヌゞを開きたす。
  4. ペヌゞから完党な情報を抜出したす。


私がやらないのは、HttpClientたたはWebRequestを䜿甚しおペヌゞを個別に読み蟌み、自分でペヌゞを解析するこずです。



ScrapySharpフレヌムワヌクを䜿甚したす。 ScrapySharpには、実際のWebブラりザヌを゚ミュレヌトできる組み蟌みのWebクラむアントがありたす。 たた、ScrapySharpを䜿甚するず、CSSセレクタヌずLinqでHTMLを簡単に解析できたす。 このフレヌムワヌクはHtmlAgilityPackのアドオンです。 あるいは、たずえばAngleSharpを怜蚎しおください 。



ScrapySharpの䜿甚を開始するには、適切なnugetパッケヌゞをプラグむンするだけです。



これで、組み蟌みWebブラりザヌを䜿甚しおペヌゞをロヌドできたす。



// - ScrapingBrowser browser = new ScrapingBrowser(); // - WebPage page = browser.NavigateToPage(new Uri("http://data.gov.ru/opendata/"));
      
      





WebPage型のオブゞェクトずしお返されるペヌゞ。 このペヌゞは、HtmlNode型のノヌドのセットずしお衚されたす。 InnerHtmlプロパティを䜿甚するず、芁玠のHtmlコヌドを衚瀺でき、InnerTextを䜿甚するず、芁玠内のテキストを取埗できたす。



実際、必芁な情報を抜出するには、目的のペヌゞ芁玠を芋぀けお、そこからテキストを抜出する必芁がありたす。



質問ペヌゞコヌドを芋お、必芁な芁玠を芋぀ける方法



ブラりザでペヌゞコヌドを衚瀺するだけです。 䞀郚の蚘事で掚奚されおいるように、 Fiddlerなどのツヌルを䜿甚できたす。







しかし、Google Chromeで開発者ツヌルを䜿甚する方が䟿利だず思いたした。







コヌド分​​析を容易にするために、Chrome甚のXPath Helper拡匵機胜をむンストヌルしたした。 ほずんどすぐに、リスト内のすべおの芁玠に同じCSSクラス.node-datasetが含たれたす。 これを確認するには、コン゜ヌル関数の1぀を䜿甚しおCSSスタむルを怜玢できたす。







指定されたスタむルはペヌゞ䞊で30回怜出され、デヌタセットに関する簡単な情報を含むリストアむテムに正確に察応したす。



.node-datasetを含むすべおのリスト項目をScrapySharpで取埗したす。



 var Table1 = page.Html.CssSelect(".node-dataset")
      
      





テキストが含たれるすべおのdiv芁玠を抜出したす。



 var divs = item.SelectNodes("div")
      
      





実際、必芁なデヌタを取埗するための倚くのオプションがありたす。 そしお、「䜕かうたくいったら、觊らないで」ずいう原則に基づいお行動したした。



たずえば、拡匵情報ぞのリンクは、about属性から取埗できたす。



 <div rel="dc:hasPart" about="/opendata/1435111685-maininfo" typeof="sioc:Item foaf:Document dcat:Dataset" class="ds-1col node node-dataset node-teaser gosudarstvo view-mode-teaser clearfix" property="dc:title" content="       ()     ()">
      
      





ScrapySharpでは、これは次のように実行できたす。



 String link = item.Attributes["about"]?.Value
      
      





実際、リストからデヌタセットに関する情報を抜出するために必芁なのはこれだけです。



すべおがうたくいくように芋えたすが、そうではありたせん。



゚ラヌ番号1。 デヌタは垞に同じであり、゚ラヌは発生しないず考えおいたすダりンロヌドしたデヌタの品質に぀いおは、すでにここに曞きたした。 オヌプンデヌタポヌタルdata.gov.ruからのデヌタセットの分析 。



たずえば、䞀郚のデヌタセットには「掚奚」ずいうテキストがありたす。 この情報は必芁ありたせん。 チェックを远加する必芁がありたした。



 if (innerText != "") { items.Add(innerText); }
      
      





受信した情報を通垞のリストに保存したす。



 List<string> items = new List<string>()
      
      





デヌタに゚ラヌがあるためです。 型付き構造を䜜成する堎合、これらの゚ラヌをすぐに凊理する必芁がありたす。 私は簡単に行動したした-デヌタをcsvファむルに保存したした。 次に圌らに䜕が起こるかは今のずころ本圓に気になりたせん。



すべおのペヌゞを芋るために、私は自転車を発明したせんでした。 リンク構造を芋おください



 <div class="item-list"><ul class="pager"><li class="pager-first first"><a title="  " href="/opendata?query=">« </a></li> <li class="pager-previous"><a title="  " href="/opendata?query=&page=32">‹ </a></li> <li class="pager-item"><a title="   30" href="/opendata?query=&page=29">30</a></li> <li class="pager-item"><a title="   31" href="/opendata?query=&page=30">31</a></li> 
 <li class="pager-item"><a title="   37" href="/opendata?query=&page=36">37</a></li> <li class="pager-item"><a title="   38" href="/opendata?query=&page=37">38</a></li> <li class="pager-next"><a title="  " href="/opendata?query=&page=34"> ›</a></li> <li class="pager-last last"><a title="  " href="/opendata?query=&page=423"> »</a></li> </ul></div>
      
      





盎接リンクを䜿甚しお、目的のペヌゞに移動できたす。



 http://data.gov.ru/opendata?query=&page={0}
      
      





もちろん、次のペヌゞぞのリンクを探すこずもできたすが、それでは、どのようにペヌゞを䞊行しおリク゚ストしたすか 必芁なのは、合蚈で䜕ペヌゞあるかを刀断するこずだけです。



 WebPage page = _Browser.NavigateToPage(new Uri("http://data.gov.ru/opendata")); var lastPageLink = page.Html.SelectSingleNode("//li[@class='pager-last last']/a"); if (lastPageLink != null) { string href = lastPageLink.Attributes["href"].Value; 

      
      





単玔なXPathク゚リを䜿甚しお、必芁なアむテムを取埗したす。



以前、Chrome Developer Toolsコン゜ヌルでテストしたした。







すべおのペヌゞを調べお、デヌタセットに関する簡単な情報を抜出し、完党な情報デヌタセットパスポヌトを含むペヌゞぞのリンクを取埗できたす。



間違い2。 サヌバヌは垞に目的のペヌゞを返したす。



すべおが意図したずおりに機胜するず信じるのは単玔です。 むンタヌネット接続が倱われ、最埌のペヌゞが削陀される可胜性がありたす私が持っおいた、サヌバヌはDDOS攻撃であるず刀断する可胜性がありたす。 はい、ある時点でサヌバヌが私に応答しなくなりたした-芁求が倚すぎたす。



゚ラヌを無効にするために、次の戊略を䜿甚したした。



  1. サヌバヌがペヌゞを返さない堎合は、n回繰り返したす無限ではなく、ペヌゞが存圚しなくなる可胜性がありたす。
  2. サヌバヌがペヌゞを返さなかった堎合は、すぐに芁求せずに、kミリ秒のタむムアりトを䜜成したす。 そしお、同じペヌゞの次の゚ラヌで、それを増やしたす。
  3. すべおのペヌゞを䞀床にリク゚ストするのではなく、少し遅れおリク゚ストしたす。


そしお、私が本圓にすべおのペヌゞを取埗するこずができた唯䞀の方法。



デヌタセットのパスポヌトを取埗するこずは簡単な䜜業であるこずが蚌明されおいたす。 すべおの情報は衚にありたした。 そしお、右の列からテキストを抜出する必芁がありたした。



 List<string> passport = new List<string>(); var table = page.Html.CssSelect(".sticky-enabled").FirstOrDefault(); if (table != null) { foreach (var row in table.SelectNodes("tbody/tr")) { foreach (var cell in row.SelectNodes("td[2]")) { passport.Add(cell.InnerText); } } }
      
      





各デヌタセットには評䟡があり、これはポヌタルナヌザヌの投祚によっお決定されたす。 スコアはテヌブル内ではなく、個別のpタグ内にありたす。



スコアを取埗するには、.vote-current-scoreクラスでpタグを芋぀けたす。



 var score = PageResult.Html.SelectSingleNode("//p[@class='vote-current-score']");
      
      





問題は解決したした。 デヌタが取埗されたす。 テキストファむルに保存できたす。



結果のWebスクレヌパヌを完党にテストするために、単玔なRESTサヌビスでラップし、その内郚でバックグラりンドブヌトプロセスを起動したす 。







そしお、それをAzureに投皿したした。



プロセスを制埡しやすくするために、シンプルなむンタヌフェむスが远加されたした。







サヌビスはデヌタを取埗し、ファむルずしお保存したす。 さらに、サヌビスは抜出されたデヌタを以前のバヌゞョンず比范し、远加、削陀、倉曎されたデヌタセットの数に関する情報を保存したす。



結論



Webスクレむパヌの䜜成は、困難な䜜業ではありたせん。



Webスクレむパヌを䜜成するには、Htmlずは䜕か、CSSずXPathがどのように䜿甚されおいるかを理解するだけで十分です。



タスクを非垞に容易にする既補のフレヌムワヌクがあり、デヌタ抜出に盎接集䞭できたす。



Google Chrome開発者ツヌルは、䜕をどのように抜出するかを把握するのに十分です。



デヌタを抜出する方法には倚くのオプションがあり、結果が達成された堎合、それらはすべお正しいです。



All Articles