目前對網頁的爬蟲一個是對網頁直接爬取數據和WeiAPI的方式爬取,這取決於網址用的何時渲染的數據,而後展現在網頁中。html
首先咱們對某一個網址準備爬取數據時候,你須要去研究這個網址是後臺給前臺是數據仍是網頁,這個時候我推薦 Fiddler 或者Fiddler.exe 和 postman 這兩個軟件進行研究,具體安裝方式和使用方式可百度,有不少的教程;若是你不想下載,那在瀏覽器中按住 F12,而後以下圖web
若是Response裏面是一個HTML,那說明這個不是WebAPI的方式,這個時候你就得選擇網頁爬蟲,在C#NuGet裏面添加 如下幾個網頁爬蟲
ChromeOptions options = new ChromeOptions(); // 不顯示瀏覽器 options.AddArgument("--headless"); // GPU加速可能會致使Chrome出現黑屏及CPU佔用率太高,因此禁用 options.AddArgument("--disable-gpu"); //禁用瀏覽器的保存密碼選項 options.AddUserProfilePreference("credentials_enable_service", false); options.BinaryLocation = webClientUrl; IWebDriver driver = new ChromeDriver(options); //進入的網址 driver.Navigate().GoToUrl(LoingUrl);//LoingUrl 就得須要鏈接的地址 // 設置頁面加載時間 driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(2000); driver.FindElement(By.Id("txtUsername")).SendKeys(userName); driver.FindElement(By.Id("txtPassword")).SendKeys(userPassword); driver.FindElement(By.Id("imgBtnSignIn")).Click(); driver.Navigate().GoToUrl(listUrl);//須要獲取數據的地址 var _trselector = driver.FindElements(By.CssSelector("這裏是你須要獲取數據的Clss或者ID對應的名稱"));// 定位到表格下的每個tr的數據
好比<div id="test_id"><div class="test">--------------</div></div> 那就是 by.CssSelector("#test_id .test") HtmlDocument htmlDocument = new HtmlDocument();//初始化一個HTMLDocument對象 htmlDocument.LoadHtml(_trselector .GetAttribute("innerHTML"));//這裏是獲取元素裏面的內容 而後數據裏面可能會有\n\t 等字符,咱們須要把他給替換 可使用Replace
二、webAPI 瀏覽器
若是Response是這種,這後臺採用的是WebAPI的方式,這個時候咱們去Headers裏面看看,RequestURL就是WebAPI的方法,而FormData就是參數,把URL和參數拼接一塊兒便可獲得數據,而後獲取數據便可,代碼以下。app
WebAPI代碼less
public void GetData(){ CookieContainer httpCookie = DoLogin(UserName, Password); if (httpCookie == null) return;//登陸是否成功 //獲取WebApi的數據 string result_CIS = GetCISList(CISURL, httpCookie); ……………………這裏就是對獲取的數據進行處理解析 } private CookieContainer DoLogin(string username, string password, string LoginURL)
{ var client = new RestClient(LoginURL); var request = new RestRequest(Method.POST); //UserName=OECSHA&Password=Oecsha123!&OfficeCode= request.AddParameter("application/x-www-form-urlencoded", $"UserName={username}&Password={password}&OfficeCode=", ParameterType.RequestBody); client.CookieContainer = new System.Net.CookieContainer(); IRestResponse response = client.Execute(request); if (!response.IsSuccessful) return null; return client.CookieContainer; } private string GetCISList(string cISURL, CookieContainer httpCookie) { var client = new RestClient(cISURL+ "參數"); var request = new RestRequest(Method.POST);//採用的方式 client.CookieContainer = httpCookie; IRestResponse response = client.Execute(request); if (!response.IsSuccessful) return null; return response.Content; }