2017-11-14 11 views
3

を使用して所望のデータを検索した後にWebページからデータをこすりすることができます。しかし、私はそれを行うことはできません。データはWebページのデータを検索した後に読み込まれるからです。は、どのように私はHTMLの敏捷性パックを使用して、私のASPXページに<a href="https://enquiry.indianrail.gov.in/ntes/" rel="nofollow noreferrer">this website</a></p> <p>から情報を取得したいHTML敏捷性

5分後に連続してデータを入力する必要があります。

答えて

2

あなたが言及したウェブサイトの検索結果は、JavaScriptを使用して動的にレンダリングされ、そのデータはAjax経由のJsonレスポンスとして提供されます。 HtmlAgilityPackは、Jsonではなく、Htmlを解析するためのものです。

SeleniumまたはiMacros .Net用のドライバ、またはWebBrowserクラス用のMicrosoft Frameworkを使用することを検討してください。これらのツールは、バックグラウンドでブラウザを実行するので、そのページでJavascriptコードを実行し、スクラップするHTMLをレンダリングできます。

適切なタイムアウトを設定するだけで、検索結果がページに表示されるまで待つことができます。

0

@derloopkatは既に言いました。ちょうどセレンを使用してください。

このサイトでは、javascriptとajaxを使用してページのHTMLを更新しています。

https://enquiry.indianrail.gov.in/ntes/NTES?action=getTrainsViaStn&viaStn=NDLS&toStn=null&withinHrs=2&trainType=ALL&6iop0ssrpi=1m1ol4ha86 

あなただけ戻ってきます次:次のURLを持つようなHTTPリクエストなかった場合でも

(function(){location.reload();/*ho ho ho ho*/})() 

意味をそのURLの最後のパラメータ:

&6iop0ssrpi=1m1ol4ha86 

"パスワード"の何か(良い言葉の欠如のため)ですか?これにより、リクエストの再生だけを再生することはできません。今、あなたはこれを解読しようとする可能性があります。しかし、非常に高密度なコードの3396行であるjavascriptファイルでは不明瞭です。だから、あなたが望むデータを受け取るために、どのようなサーバを送るべきかを知ることは非常に困難です(たぶん不可能かもしれません)。

サーバーからの応答は決してHTMLではなく、JSONであることがさらに優れています。

_obj_1511003507337 = { 
trainsInStnDataFound:"trainRunningDataFound", 
allTrains:[ 
{ 
trainNo:"14316", 
startDate:"18 Nov 2017", 
trainName:"INTERCITY EXP", 
trnName:function(){return _LANG==="en-us"?"INTERCITY EXP":"इंटरसिटीएक्स."}, 
trainSrc:"NDLS", 
trainDstn:"BE", 
runsOn:"NA", 
schArr:"Source", 
schDep:"16:35, 18 Nov", 
schHalt:"Source", 
actArr:"Source", 
delayArr:"RIGHT TIME", 
actDep:"16:35, 18 Nov", 
delayDep:"RIGHT TIME", 
actHalt:"Source", 
trainType:"MEX", 
pfNo:"9" 
} , 
trainNo:"12625", 
startDate:"16 Nov 2017", 
trainName:"KERALA EXPRESS", 
trnName:function() { return _LANG === "en-us" ? "KERALA EXPRESS" : "केरलएक्स."}, 
trainSrc:"TVC", 
trainDstn:"NDLS", 
runsOn:"NA", 
schArr:"13:45, 18 Nov", 
schDep:"Destination", 
schHalt:"Destination", 
actArr:"16:56, 18 Nov", 
delayArr:"03:11", 
actDep:"Destination", 
delayDep:"RIGHT TIME", 
actHalt:"Destination", 
trainType:"SUF", 
pfNo:"4" 
} 
    ] 
} 

ここでは、Seleniumを使用してHTMLとデータを取得する方法を示します。

using System; 
using System.Collections.Generic; 
using System.Net; 
using HtmlAgilityPack; 
using OpenQA.Selenium.Firefox; 
using OpenQA.Selenium; 
using System.Threading; 

namespace test 
{ 
    class Program 
    { 

    public static void Main(string[] args) 
    { 
      string url = "https://www.google.com"; 
      IWebDriver driver = new FirefoxDriver(); 
      driver.Navigate().GoToUrl("https://enquiry.indianrail.gov.in"); 
      Console.WriteLine("Step 1"); 
      driver.FindElement(By.XPath("//a[@id='ui-id-2']")).Click(); 
      Thread.Sleep(10000); 
      Console.WriteLine("Step 2"); 
      driver.FindElement(By.XPath("//input[@id='viaStation']")).SendKeys("NEW DELHI [NDLS]"); 
      Thread.Sleep(2000); 
      Console.WriteLine("Step 3"); 
      driver.FindElement(By.XPath("//button[@id='viaStnGoBtn']")).Click(); 

      //PRESS A KEY WHEN THE HTML IS FULLY LOADED 
      Console.ReadKey(); 



      HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
      doc.LoadHtml(driver.PageSource); 

      HtmlNodeCollection nodeCol = doc.DocumentNode.SelectNodes("//body//tr[@class='altBG']"); 
      foreach(HtmlNode node in nodeCol){ 
       Console.WriteLine("Trip:"); 
       foreach(HtmlNode child in node.ChildNodes) 
       { 
        Console.WriteLine("\t" + child.InnerText); 
       } 
      } 
      //Console.WriteLine(doc.DocumentNode.InnerHtml); 
      Console.ReadKey(); 

    } 

Thread.Sleep()は必要ありません。私はちょうど予防策としてそれらを入れた。ヘッドレスドライバであるPhantomJSのような別のドライバを使用すると、スピードを最適化することもできます。

関連する問題