2016-10-24 5 views
0

ウェブサイトから動的データを盗んでいます。何らかの理由で私が取得したPageSourceは部分的です。ただし、ChromeまたはFirefoxブラウザから直接ページソースを表示すると部分的ではありません。私はページからデータを完全に掻き集める答えを知りたいです。部分ダウンロードではなく、ページソースを完全にダウンロードする方法は?

私のアプリケーションでは、.Net Webブラウザなどを使用してプログラムでスクレイプします。私はChromeDriverでSelenium WebDriver 2.48.2を使用しようとしました。私はPhantomJSDriverも試みました。私もWebClientを試しました。また、HttpWebRequestすべての.Net 4.6.1。

URL:http://contests.covers.com/KingOfCovers/Contestant/PendingPicks/ARTDB次のどれが機能していない

...

試み#1:HttpWebRequestの

var urlContent = ""; 

    try 
    { 
     var request = (HttpWebRequest) WebRequest.Create(url); 
     request.CookieContainer = new CookieContainer(); 
     if (cookies != null) 
     { 
      foreach (Cookie cookie in cookies) 
      { 
       request.CookieContainer.Add(cookie); 
      } 
     } 

     var responseTask = Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse,request.EndGetResponse,null); 

     using (var response = (HttpWebResponse)await responseTask) 
     { 

      if (response.Cookies != null) 
      { 
       foreach (Cookie cookie in response.Cookies) 
       { 
        cookies.Add(cookie); 
       } 
      } 

      using (var sr = new StreamReader(response.GetResponseStream())) 
      { 
       urlContent = sr.ReadToEnd(); 
      } 
     } 

試み#2:WebClientの

// requires async method signature 
      using (WebClient client = new WebClient()) 
      { 
       var task = await client.DownloadStringTaskAsync(url); 

       return task; 
      } 

試み#3:PhantomJSDriver

var driverService = PhantomJSDriverService.CreateDefaultService(); 
     driverService.HideCommandPromptWindow = true; 
     using (var driver = new PhantomJSDriver(driverService)) 
     { 
      driver.Navigate().GoToUrl(url); 

      WaitForAjax(driver); 

      string source = driver.PageSource; 

      return source; 
     } 

    public static void WaitForAjax(PhantomJSDriver driver) 
    { 
     while (true) // Handle timeout somewhere 
     { 
      var ajaxIsComplete = (bool)(driver as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"); 
      if (ajaxIsComplete) 
       break; 
      Thread.Sleep(100); 
     } 
    } 

私はまた、ページオブジェクトモデルを使用してChromeDriverを試してみました。そのコードは長すぎてここに貼り付けることはできません。それにもかかわらず、それは他の3回の試みと全く同じ結果を有する。

期待される成果

URLからデータテーブルが欠落しているデータなしで、完了です。たとえば、以下のスクリーンショットと比較するスクリーンショットです。観察すべきことは、 "..."がないということです。代わりにデータがあります。これは、FirefoxまたはChromeでURLを開き、右クリックしてページソースを表示することで再現できます。

enter image description here

矢印は、スクリーンショットに示すとおり実績

は、「...」大きなギャップですことを確認します。その "..."の代わりに多くの行のコンテンツが必要です。これは、上記のいずれかの試みを使用して再現することができます。

enter image description here

URLが動的なデータであることに注意してください。スクリーンショットとまったく同じ結果が表示されない可能性があります。それにもかかわらず、エクササイズは繰り返すことができますが、単にスクリーンショットとは異なるように見えます。データが欠落していることを理解するための簡単なテストは、ページソース行数を比較することです。「完全な」データセットはhtmlの2倍近くの行を持ちます。

+0

あなたは結果を表示するために何を使用していますか?..「...」はしばしば言いたいことです。ここには他にもたくさんの情報があります。 1,2,3,4、...、99998、99999など – Keith

+0

上記のメソッドから直接PageSourceをコピーしてメモ帳++に貼り付けています。私は、 "エキスパンダー"や目に見えるようにできる隠されたコンテンツは見ません。同じことをVS2015にコピー/貼り付けすることもできます。 – sapbucket

+0

しかし、あなたのC#ではあなたのコードをコピーしていますか?あなたのコードでは、あなたは - > 'urlContent = sr.ReadToEnd();'これからの結果をどうやって見ていますか?あなたはデバッガからコピーしていますか?もしそうなら、トリミングしているデバッガのオブジェクトインスペクタかもしれません。 urlContentから結果を取得してファイルに保存しようとしましたか?例えば。 'System.IO.File.WriteAllText(@" temp.txt "、urlContent);' – Keith

答えて

1

[OK]をクリックします。喜んで助けてくれた。 :)

あなたのC#ではコピーしていますか?あなたのコードにあります - >urlContent = sr.ReadToEnd();どうしたら結果が見えますか?あなたはデバッガからコピーしていますか?もしそうなら、トリミングしているデバッガのオブジェクトインスペクタかもしれません。 urlContentから結果を取得してファイルに保存しようとしましたか?例えば。System.IO.File.WriteAllText(@"temp.txt",urlContent);

関連する問題