在爬蟲過程中,有的網頁是動態更新的,有的數據會在頁面加載時通過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