Selenium + C# 實現模擬百度貼吧簽到 1
程式碼直通車
Github FoxCrawler專案下的SeleniumClawer解決方案
工具介紹
Selenium:是一個自動化測試工具,封裝了很多WebDriver用於跟瀏覽器核心通訊,我用開發語言來呼叫它實現PhantomJS的自動化操作。它的下載頁面裡有很多東西,我們只需要Selenium Client,它支援了很多語言(C#、JAVA、Ruby、Python、NodeJS),按自己所學語言下載即可。
下載地址:http://docs.seleniumhq.org/download/
Nuget 使用
Selenium的好處
Selenuim的好處是顯而易見的,當我們爬取網站資訊時候,難免會碰到非同步載入,資料延時繫結,資料介面定位難,加密資訊解碼難等問題。其實最終資料都會完整的顯示在介面上,既然資料能夠顯示出來,使用Selenium操控WebDriver進行模擬瀏覽器行為(點選,切換,移動)等等事件,等待資料顯示,然後使用選擇器(Id,Class,XPath等)進行爬取,這是一種符合人習慣的程式設計方式。當然我也不是說其他的方式不好,只是在同等時間的情況下,這種方式效率更高,耗時更快,可靠性也更高。
下面使用Selenium進行一個簡單的百度貼吧一鍵簽到功能編碼
專案建立,環境配置
開啟Vs,新建控制檯專案,使用Nuget獲取最新Selenium的C#庫,然後根據自己機型安裝的瀏覽器選擇WebDirver(有點類似執行時開啟的模擬瀏覽器,不過時單獨的一個.exe檔案,首先你電腦要安裝這個瀏覽器),我以自己的電腦Chrome瀏覽器為例子,所以我Nuget下載一個
下載完成後在專案根目錄的packages資料夾中找到對應內容
根據系統型別,系統是32還是64自行選擇
複製.exe檔案到專案Bin資料夾下即可,環境配置完成
先來一下簡單例子
在完成一鍵簽到功能之前,我們先來完成一個簡單的例子,這樣能讓大家對這種方式有一個基本的瞭解
我的例子選取的是某學校的通知公告資料爬取,進行一般爬蟲和Selenium爬取的區別
爬取地址
http://www.jit.edu.cn/myNews_list_out.aspx?infotype=1
普通方式爬取
我們首先要分析如何獲取資料,當我們點選下一頁的時候,我們發現頁面整體重新整理,且位址列沒有發生變化,通過分析Respons資訊我們發現IIS字樣,這樣可以推定使用的技術是.net webform 自帶的gridview服務端控制元件,這種方式自帶了加密驗證,破解的方式網上有,就是要獲取每次頁面生成的加密碼,然後帶上其他引數向後臺重新發起請求。
缺點:
如果使用這種方式,當我們碰到不同的問題,需要根據不同的問題尋找解決方案,測試可行然後再進行編碼,要花多的時間在一個一個沒有接觸過的問題身上。
Selenium 模擬爬取
這種方式就相對簡單,也很好理解。編碼的邏輯就是如下
1、開啟網頁
2、找到下一頁按鈕
3、模擬點選
4、資料獲取
這樣的方式就和我們使用瀏覽器操作習慣一置,邏輯也更加清楚。
接下去我就基於這一種方法,對程式碼進行說明
開啟網頁
var docHtml = new HtmlDocument();
var driver = new ChromeDriver();
driver.Navigate().GoToUrl("http://www.jit.edu.cn/myNews_list_out.aspx?infotype=1");
業務邏輯
程式碼簡單明瞭,爬取當頁資料,然後找到下一頁按扭,如果存在點選,如何不存在,退出迴圈
bool nextpage = true;
do
{
ReadOnlyCollection<IWebElement> newsNodes =
driver.FindElements(By.XPath("//*[@id=\"table_list\"]/li/a")); //獲取li內容
GetNewList(newsNodes);//獲得新聞內容
docHtml.LoadHtml(driver.PageSource);
//找到下一頁按鈕
HtmlNode node = docHtml.GetElementbyId("nextpage");
IWebElement element = null;
if (node != null)
{
element = driver.FindElementById("nextpage");
}
else
{
nextpage = false;
}
//如果存在下一頁按鈕,模擬點選
if (nextpage)
{
element.Click();
}
} while (nextpage);
獲取新聞內容
private static List<NewInfo> GetNewList(ReadOnlyCollection<IWebElement> newsNodes)
{
List<NewInfo> newInfoList = new List<NewInfo>();
foreach (var news in newsNodes)
{
newInfoList.Add(new NewInfo()
{
Url = news.GetAttribute("href"),
Title = news.Text
});
Console.WriteLine($"{news.Text} {news.GetAttribute("href")}");
}
return newInfoList;
}
好處:
1、程式碼簡單明瞭
2、邏輯清晰
3、後期維護方便
相關文章
- selenium實現疫情簽到
- 使用Selenium模擬登陸百度盤
- 百度貼吧怎麼儲存看過的影片?百度貼吧儲存影片的方法
- 爬取百度貼吧實戰,python教你如何獲取Python
- 百度貼吧怎麼儲存看過的視訊?百度貼吧儲存視訊的方法
- Python+Selenium+phantomjs實現網頁模擬登入和截圖PythonJS網頁
- 模擬退火演算法(1)Python 實現演算法Python
- selenium模擬登入12306
- selenium與python自動化測試模擬登入百度Python
- 虛擬蜜罐:從資訊模擬到實現虛擬蜜罐技術
- 從零到有模擬實現一個Set類
- 「用愛發電」的百度貼吧遊戲吧主遊戲
- 百度貼吧賬號小號高等級高吧齡價美物廉
- laravel + redis + bitmap 實現簽到功能LaravelRedis
- promise的模擬實現Promise
- 迴圈點選連結selenium模擬
- 簽到領金幣模組
- bind,call,apply模擬實現APP
- 【Java】——模擬登入實現Java
- JavaScript中模擬實現jsonpJavaScriptJSON
- 模擬實現apply/call/bindAPP
- javascript模擬new的實現JavaScript
- JavaScript 模擬new的實現JavaScript
- JavaScript模擬實現replaceAll方法JavaScript
- 貼吧小試牛刀
- noip模擬1
- CSP模擬1
- 為爬蟲框架構建Selenium模組、DSL模組(Kotlin實現)爬蟲框架架構Kotlin
- 爬蟲實戰(二):Selenium 模擬登入並爬取資訊爬蟲
- C# .NET Framework 實現SM2加簽、驗籤C#Framework
- strlen函式的模擬實現函式
- bind/new/instanceof/assign模擬實現
- 模擬實現簡易版shell
- Selenium自動化實現web自動化-1Web
- 模擬百度搜尋
- 三維模擬模擬如何實現精益工廠佈局?
- C#專案—模擬考試C#
- C# Post 模擬表單提交C#