web-dev-qa-db-ja.com

C#でJavaScriptによって生成されたWebページのスクレイピング

私はwebBrowserとVisual Studioのラベルを持っていますが、基本的に私がやろうとしていることは、別のWebページからセクションを取得することです。

WebClient.DownloadStringとWebClient.DownloadFileを使用してみましたが、JavaScriptがコンテンツをロードする前に、どちらもWebページのソースコードを提供してくれました。私の次のアイデアは、WebBrowserツールを使用して、ページが読み込まれた後にwebBrowser.DocumentTextを呼び出すだけで、それが機能しない場合でも、ページの元のソースを提供することでした。

Javascriptload後のページを取得する方法はありますか?

16
Prokzy

問題は、ブラウザが通常JavaScriptを実行し、結果としてDOMが更新されることです。 JavaScriptを分析したり、JavaScriptが使用するデータを傍受したりできない場合を除き、ブラウザと同じようにコードを実行する必要があります。以前、同じ問題に遭遇しましたが、ページをレンダリングするためにSeleniumとPhantomJSを利用しました。ページをレンダリングした後、WebDriverクライアントを使用してDOMをナビゲートし、必要なコンテンツを取得し、AJAXをポストします。

高レベルでは、これらはステップです:

  1. インストールされたセレン: http://docs.seleniumhq.org/
  2. Seleniumハブをサービスとして開始
  3. ダウンロードしたphantomjs(JavaScriptを実行できるヘッドレスブラウザー): http://phantomjs.org/
  4. Seleniumハブを指すwebdriverモードでphantomjsを開始しました
  5. 私のスクレイピングアプリケーションでは、webdriverクライアントnugetパッケージをインストールしました:Install-Package Selenium.WebDriver

Phantomjs Webdriverの使用例は次のとおりです。

var options = new PhantomJSOptions();
options.AddAdditionalCapability("IsJavaScriptEnabled",true);

var driver = new RemoteWebDriver( new URI(Configuration.SeleniumServerHub),
                    options.ToCapabilities(),
                    TimeSpan.FromSeconds(3)
                  );
driver.Url = "http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083";
driver.Navigate();
//the driver can now provide you with what you need (it will execute the script)
//get the source of the page
var source = driver.PageSource;
//fully navigate the dom
var pathElement = driver.FindElementById("some-id");

Selenium、phantomjs、webdriverの詳細については、次のリンクを参照してください。

http://docs.seleniumhq.org/

http://docs.seleniumhq.org/projects/webdriver/

http://phantomjs.org/

編集:より簡単な方法

Phantomjsのnugetパッケージがあるようです。ハブは必要ありません(この方法でクラスターを使用して大量の廃棄を行いました)。

Webドライバーをインストールします。

Install-Package Selenium.WebDriver

埋め込みexeをインストールします。

Install-Package phantomjs.exe

更新されたコード:

var driver = new PhantomJSDriver();
driver.Url = "http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083";
driver.Navigate();
//the driver can now provide you with what you need (it will execute the script)
//get the source of the page
var source = driver.PageSource;
//fully navigate the dom
var pathElement = driver.FindElementById("some-id");
43
wbennett

わかりました私はphantomjsとselenuimをc#で使用してjavascriptを有効にする方法を紹介します

  1. 新しいコンソールプロジェクトを作成し、必要に応じて名前を付けます
  2. 右手にあるソリューションエクスプローラーに移動します
  3. [参照]を右クリックし、[NuGetパッケージの管理]をクリックします
  4. ウィンドウは、Selenium.WebDriverをインストールするよりも、参照をクリックして表示します。
  5. ここからdownold phantomjs Phantomjs
  6. あなたのメイン関数でこのコードを入力してください

        var options = new PhantomJSOptions();
        options.AddAdditionalCapability("IsJavaScriptEnabled", true);
        IWebDriver driver = new PhantomJSDriver("phantomjs Folder Path", options);
        driver.Navigate().GoToUrl("https://www.yourwebsite.com/");
    
        try
        {
            string pagesource = driver.PageSource;
            driver.FindElement(By.Id("yourelement"));
            Console.Write("yourelement founded");
    
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
    
        }
    
        Console.Read();
    

yourwebsiteとあなたが探している要素、そしてあなたのマシンのphantomjs.exeパスをこのコードの下に置くことを忘れないでください

コーディングの時間と感謝 wbennett

1
elaz

Wbennetのおかげで、発見 https://phantomjscloud.com 。 Web API呼び出しを通じてページをスクラップするのに十分な無料サービス。

    public static string GetPagePhantomJs(string url)
    {
        using (var client = new System.Net.Http.HttpClient())
        {
            client.DefaultRequestHeaders.ExpectContinue = false;
            var pageRequestJson = new System.Net.Http.StringContent(@"{'url':'" + url + "','renderType':'html','outputAsJson':false }");
            var response = client.PostAsync("https://PhantomJsCloud.com/api/browser/v2/{YOUT_API_KEY}/", pageRequestJson).Result;
            return response.Content.ReadAsStringAsync().Result;
        }
    }

うん。

0
CrazyDev