2014-06-18 54 views
11

我有一個webBrowser,並在Visual Studio中有一個標籤,基本上我想要做的是從另一個網頁抓取一個部分。用C生成的JavaScript生成的網頁#

我試過使用WebClient.DownloadString和WebClient.DownloadFile,並且它們都給了我在JavaScript加載內容之前的網頁源代碼。我的下一個想法是使用WebBrowser工具,並在加載頁面後調用webBrowser.DocumentText並且不起作用,它仍然爲我提供了頁面的原始來源。

有沒有辦法讓我抓住頁面後的javascriptload?

這是我試圖抓取的頁面。

http://www.regulations.gov/#!documentDetail;D=APHIS-2013-0013-0083

我需要評論關閉該頁面,該頁面產生的。

回答

29

問題是瀏覽器通常會執行javascript,並且它會導致更新的DOM。除非您可以分析JavaScript或攔截它使用的數據,否則您需要按瀏覽器執行代碼。在過去,我遇到了同樣的問題,我利用硒和PhantomJS來渲染頁面。在呈現頁面之後,我將使用WebDriver客戶端來瀏覽DOM並檢索我需要的內容,併發布AJAX。

在一個高的水平,這些步驟如下:

  1. 安裝硒:http://docs.seleniumhq.org/
  2. 開始硒轂作爲服務
  3. 下載phantomjs(模擬瀏覽器,能夠執行JavaScript ):http://phantomjs.org/
  4. 在webdriver模式下啓動phantomjs指向硒轂
  5. 在我的scraping應用程序中安裝了webdriver客戶端nuget包:Install-Package Selenium.WebDriver

這裏是phantomjs的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"); 

更多信息,可以在下面的鏈接中找到:

http://docs.seleniumhq.org/

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

http://phantomjs.org/

編輯:更簡單的方法

這似乎有一個NuGet包的phantomjs,這樣你不需要集線器(我用了一個集羣做大規模的報廢以這種方式):

安裝網絡驅動程序:

Install-Package Selenium.WebDriver 

安裝嵌入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"); 
+0

作品完美 – Flynn

+0

謝謝很好的例子。完美的作品。 –

+0

我試過了,但是driver.Url沒有改變。甚至不要例外。只是通過,它仍然是行動:空白。因此導航返回像。我嘗試了另一個網址。等一下,然後轉到下一行。當然,代碼的結尾找不到some-id。任何想法? –

1

好的,我會告訴你如何使用phantomjs和selenuim用C#啓用javascript

  1. 創建一個新的控制檯項目命名爲您希望
  2. 去解決方案瀏覽器在你的右手
  3. 右鍵點擊參考點擊管理NuGet包
  4. 一個windows會顯示點擊瀏覽比ins高大Selenium.WebDriver
  5. downold從這裏Phantomjs
  6. phantomjs在主函數類型的代碼

    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和你loooking的元素和幻影。在您的電腦在這下面的代碼

exe文件路徑有編碼的美好時光,並感謝wbennett