C#爬蟲之Senlium


在爬蟲過程中,有的網頁是動態更新的,有的數據會在頁面加載時通過js加載或者用ajax加載,這時候如果只用普通的Request和Response獲取的HTML頁面將會不完整。所以這時候可以采用Senlium.

Selenium 是用於Web應用程序自動化測試的開源工具。通過Selenium,你可以模擬用戶在瀏覽器中的操作。

Selenium可以模擬多種瀏覽器,目前主流是IE、Chrome、FireFox。這里我采用的Chrome瀏覽器。

首先在VS使用NuGet安裝

 

然后使用Chrome瀏覽器則安裝

 

安裝完后在解決方案目錄下的packages\Selenium.Chrome.WebDriver.2.42\driver中找到chromedriver.exe放到Bin的目錄中。

之后引用命名空間:在Selenium之前都得加OpenQA,例如:

       Using OpenQA.Selenium;

       首先模擬打開瀏覽器:

         Var driver=new ChromeDriver();

         driver.Manage().Window.Maximize();

         driver.Navigate().GoToUrl("URL");

       這時候谷歌瀏覽器則會彈出一個界面。

具體API可以詳看:

https://seleniumhq.github.io/selenium/docs/api/dotnet/

一些小貼示:

1、 一般查找使用FindElement(By.---()),若找不到可以設置等待時間等待頁面加載

2、 如果頁面需要在新的標簽頁打開窗口,則可以用JS腳本例如

  string js = string.Format("window.open(\"{0}\")", downLoad);

  driver.ExecuteScript(js);

3、 頁面中有的元素是在IFrame中,如果不先找到IFrame,則不會找到里面的屬性,所以可以先用

  driver.SwitchTo().Frame(str)

4、 有時候我們需要等待瀏覽器加載則可以設置timeouts,Selenium有三種超時等待方式:

  1)、顯式等待

  顯式等待,就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間之內都沒找到,那么就跳出Exception.

  需要用到WebDriverWait

  2)、隱式等待

  隱式等待, 此處的隱式等待是針對Driver 每次執行命令的最長執行時間也可以理解為超時時間,一些人對此處有誤解,認為是讓Driver等一段時間,確實某些時候能讓Driver等一段時間, 但是影響是全局的,每次Driver執行找不到元素都會等待此處設置的時間,假設某處將此值設置的太長,必須在執行完成之后還原回來,否則判斷一個元素是否存在的時候,就會遇到很坑爹的問題。

  改進后的方法如下:WebDriver會進行一個隱式等待,但參數只有時間,這就導致我需要什么元素出現,我不一定能等到它        

     driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10000);

  3)、線程休眠

       Thread.Sleep();

5.如果切換不同標簽可以需要用到句柄例如:能夠跳到第一個標簽頁

  ReadOnlyCollection<string> windowsHandles = driver.WindowHandles;

       driver.SwitchTo().Window(windowsHandles[0]);

 6.如果需要打開新的標簽頁可以使用瀏覽器執行JS

  string js = "window.open(\"http://baidu.com\");";
  driver.ExecuteScript(js);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM