Selenium + C# 實現模擬百度貼吧簽到 1

weixin_34393428發表於2018-08-07

程式碼直通車
Github FoxCrawler專案下的SeleniumClawer解決方案

工具介紹

Selenium:是一個自動化測試工具,封裝了很多WebDriver用於跟瀏覽器核心通訊,我用開發語言來呼叫它實現PhantomJS的自動化操作。它的下載頁面裡有很多東西,我們只需要Selenium Client,它支援了很多語言(C#、JAVA、Ruby、Python、NodeJS),按自己所學語言下載即可。

下載地址:http://docs.seleniumhq.org/download/

Nuget 使用


4177671-ac628abffcade2c6.png
image.png

Selenium的好處
Selenuim的好處是顯而易見的,當我們爬取網站資訊時候,難免會碰到非同步載入,資料延時繫結,資料介面定位難,加密資訊解碼難等問題。其實最終資料都會完整的顯示在介面上,既然資料能夠顯示出來,使用Selenium操控WebDriver進行模擬瀏覽器行為(點選,切換,移動)等等事件,等待資料顯示,然後使用選擇器(Id,Class,XPath等)進行爬取,這是一種符合人習慣的程式設計方式。當然我也不是說其他的方式不好,只是在同等時間的情況下,這種方式效率更高,耗時更快,可靠性也更高。

下面使用Selenium進行一個簡單的百度貼吧一鍵簽到功能編碼

專案建立,環境配置

開啟Vs,新建控制檯專案,使用Nuget獲取最新Selenium的C#庫,然後根據自己機型安裝的瀏覽器選擇WebDirver(有點類似執行時開啟的模擬瀏覽器,不過時單獨的一個.exe檔案,首先你電腦要安裝這個瀏覽器),我以自己的電腦Chrome瀏覽器為例子,所以我Nuget下載一個


4177671-940c0fd57a41a8b1.png
chrome.webdriver.png

下載完成後在專案根目錄的packages資料夾中找到對應內容
根據系統型別,系統是32還是64自行選擇


4177671-d08950a77377f413.png
路徑.png

複製.exe檔案到專案Bin資料夾下即可,環境配置完成

先來一下簡單例子

在完成一鍵簽到功能之前,我們先來完成一個簡單的例子,這樣能讓大家對這種方式有一個基本的瞭解
我的例子選取的是某學校的通知公告資料爬取,進行一般爬蟲和Selenium爬取的區別

爬取地址
http://www.jit.edu.cn/myNews_list_out.aspx?infotype=1

4177671-0d0e4b707a543bae.png
截圖.png

普通方式爬取

我們首先要分析如何獲取資料,當我們點選下一頁的時候,我們發現頁面整體重新整理,且位址列沒有發生變化,通過分析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、後期維護方便

相關文章