.net 信息採集ajax數據

来源:https://www.cnblogs.com/zeshao/archive/2018/08/25/9534861.html
-Advertisement-
Play Games

.net 信息採集ajax數據 關於.net信息採集的資料很多,但是如果採集的網站是ajax非同步載入數據的模式,又如何採集呢?今天就把自己做信息採集時,所遇到的一些問題和心得跟大家分享一下。 採集網站的幾種方式與利弊: 利用系統自帶HttpWebRequest對象,採集網站內容,優點是採集效率快,但 ...


.net 信息採集ajax數據

關於.net信息採集的資料很多,但是如果採集的網站是ajax非同步載入數據的模式,又如何採集呢?今天就把自己做信息採集時,所遇到的一些問題和心得跟大家分享一下。

採集網站的幾種方式與利弊:

  1. HttpWebRequest

利用系統自帶HttpWebRequest對象,採集網站內容,優點是採集效率快,但是如果網站是ajax非同步載入數據的方式,是採集不到網頁內容的,並且網站沒有採用ajax的方式,在網頁中用到了javascript,比如說:網頁內容用document.write的方式輸出到網頁中的,這種情況也是獲取不到內容的。其次還需要知道對方網站的編碼格式(就是網頁頭部中<meta charset="utf-8"/>),如果採集時網站編碼格式錯誤的話,會導致採集的內容是亂碼。但這個是小問題,我自己當時查閱資料時找到了別人封裝好的方法,但是很慚愧因為不知道作者是誰了,我會把相應的代碼下載鏈接提供給大家。以上的問題是因為js和ajax是需要瀏覽器去解析的,所以導致了獲取不到網頁內容。

Help.HttpHelp.HttpRequest("採集的網址");

源碼下載地址

          2.瀏覽器控制項

因為當時我開發的時候,用的是cs模式,相信大家同樣也會用cs的模式去開發這個功能。既然是cs模式(不考慮美觀)的情況下肯定是WinForm,WinForm中有自帶的瀏覽器控制項,這個是不好用的,我當時用的是Geckofx,基於火狐內核的一款瀏覽器控制項,但是這方面的資料很少,當時遇到了一些問題都找不到解決方法,但後來還是都解決了。用了該控制項就可以獲取到ajax非同步載入的數據,在網頁載入完成之後,延遲幾秒鐘獲取網頁內容,就可以很方便的獲取到網頁內容,缺點是相對第一種方案來說的話會慢一些,因為它是一個瀏覽器控制項,需要渲染html和解析js等操作。

Geckofx下載

GeckoWebBrowser webBrowser = null;

        private void Form1_Load(object sender, EventArgs e)
        {
            string xulrunnerPath = AppDomain.CurrentDomain.BaseDirectory + "\\bin";
            Xpcom.Initialize(xulrunnerPath);
            //設置為3阻止所有的彈出視窗,
            GeckoPreferences.User["privacy.popups.disable_from_plugins"] = 3;
            //禁止載入圖片
            GeckoPreferences.User["permissions.default.image"] = 2;

            webBrowser = new GeckoWebBrowser();
            webBrowser.Navigate("http://www.baidu.com");
            webBrowser.DocumentCompleted += DocumentCompleted;
        }

        private void DocumentCompleted(object sender, Gecko.Events.GeckoDocumentCompletedEventArgs e)
        {
            var time = new System.Windows.Forms.Timer();
            time.Interval = 2000;
            time.Tick += (a, b) =>
            {
                time.Stop();
                string html = "";
                //頁載入完成
                GeckoHtmlElement element = null;
                var geckoDomElement = webBrowser.Document.DocumentElement;
                if (geckoDomElement != null && geckoDomElement is GeckoHtmlElement)
                {
                    element = (GeckoHtmlElement)geckoDomElement;
                    //網頁內容
                    html = element.InnerHtml;
                    txtHtml.Text = html;
  /*
                    //通過xpath 查找class為btnLogin的元素
                    GeckoNode btnLogin = webBrowser.Document.SelectFirst(".//*[@class='btnLogin']");
                    if (btnLogin != null)
                    {
                        GeckoHtmlElement ie = btnLogin as GeckoHtmlElement;
                        //手動觸發點擊事件
                        ie.Click();
                    }*/ } }; time.Start(); }

 

         3.phantomjs

phantomjs可以把它理解為也是一個瀏覽器控制項,只不過它使用QtWebKit作為它核心瀏覽器的功能,使用webkit來編譯解釋執行JavaScript代碼。利用該組件就可以很方便的獲取到網頁內容,同時也包括了ajax載入的數據,如果是分頁的情況下,首次載入不需要延遲,如果獲取第2頁及以上內容的話同樣也需要延遲才能獲取到,並且它可以很方便的完成網頁快照(就是網頁截屏),至於其他的功能大家可以自己查閱一下資料。

phantomjs下載地址

  IWebDriver driver = null;

        private void btnGo_Click(object sender, EventArgs e)
        {
            string phantomjsDire = AppDomain.CurrentDomain.BaseDirectory;

            PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService(phantomjsDire);
            service.IgnoreSslErrors = true;
            service.LoadImages = false;
            service.ProxyType = "none";

            driver = new PhantomJSDriver(phantomjsDire);
            /*IWindow iWindow = driver.Manage().Window;
            iWindow.Size = new Size(10,10);
            iWindow.Position = new Point(0, 600);*/

            driver.Navigate().GoToUrl(textBox1.Text);
            string html = driver.PageSource;
            txtHtml.Text = html;

            //driver.Close();
            //driver.Quit();
        }

        private void btnPage_Click(object sender, EventArgs e)
        {
            //  .//*[@class='next'][text()='下一頁']
            //  .//*[@class='text']
            //  .//*[@class='button']
            //IWebElement element = driver.FindElement(By.XPath(".//*[@class='text']"));
            //給網頁中文本框賦值
            //element.SendKeys("4");

            IWebElement btnElement = driver.FindElement(By.XPath(".//*[@class='next'][text()='下一頁']"));
            btnElement.Click();

            var time = new System.Windows.Forms.Timer();
            time.Interval = 2 * 1000;
            time.Tick += (a, b) =>
            {
                time.Stop();
                string html = driver.PageSource;
                txtHtml.Text = html;
            };
            time.Start();
        }

 網站內容中url地址如果是相對地址的話,就是../../a.html,這種情況要想獲取絕對地址的話,可以用以下方法:

        /// <summary>
        /// 獲取絕對url地址
        /// </summary>
        /// <param name="baseUri">當前頁地址</param>
        /// <param name="relativeUri">相對路徑地址</param>
        /// <returns></returns>
        public static string GetRealUrl(string baseUri, string relativeUri)
        {
            try
            {
                baseUri = System.Web.HttpUtility.UrlDecode(baseUri);
                relativeUri = System.Web.HttpUtility.UrlDecode(relativeUri);
                Uri baseUriModel = new Uri(baseUri);
                Uri uri = new Uri(baseUriModel, relativeUri);
                string result = uri.ToString();
                baseUriModel = null;
                uri = null;
                return result;
            }
            catch (Exception ex)
            {
            }
            return relativeUri;
        }

 

  總結:

以上說的第2、3種方式都可以獲取到ajax非同步載入的內容,同時還能通過xpath模式查找網頁中的元素,例如分頁標簽和按鈕,找到元素之後可以調用click點擊事件,就能輕鬆的解決分頁問題。好多網站分頁分到最後一頁的時候,處理的情況都不一樣,需要自己去處理,例如有的隱藏下一頁按鈕、有的是禁用等等。

獲取到網頁內容之後,要想獲取自己需要的內容,可以通過HtmlAgilityPack插件,它是通過xpath的模式查找內容。

以下我會將自己開發的信息採集系統截圖發出來。

 

歡迎任何形式的轉載,但請務必註明出處。

文案功底有限,碼字不易,不喜勿噴,如果文章和代碼有表述不當之處,還請不吝賜教。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python中的For迴圈 1.For迴圈語句 1.Python for迴圈可以遍歷任何序列類型,如一個列表或者一個字元串。如下代碼應該能理解,依次輸出序列元素。 2.for else語句(就是在迴圈結束後,執行else的內容) 3.for迴圈中的break語句與countinue語句(條件達成時, ...
  • 一、三元表達式的使用 name = 'alex' age = 20 if name == 'alex' else 22 print(age) 二、列表推導式(聲明式編程) l = ['alex%s' %i for i in range(10) if i > 5] print(l) 三、生成器表達式 ...
  • 前言 Python 是一種極具可讀性和通用性的編程語言。Python 這個名字的靈感來自於英國喜劇團體 Monty Python,它的開發團隊有一個重要的基礎目標,就是使語言使用起來很有趣。Python 易於設置,並且是用相對直接的風格來編寫,對錯誤會提供即時反饋,對初學者而言是個很好的選擇。 Py ...
  • 我們在coding的時候,會經常遇到要求我們處理InterruptedException的情況,本文將解釋如何正確處理此異常以及背後的原因。 ...
  • 相信很多微信用戶在使用微信給朋友,同事發送相冊中的文件時,微信會顯示你手機中的視頻文件,這樣很不方便. 如果要完全不顯示視頻文件: 隨便在手機中建立一個文件夾,名字叫 ".nomedia",把視頻文件丟進去就行了. 如何隱藏你希望隱藏的視頻文件: 隨便在手機中建立一個文件夾,名字叫 ".nomedi ...
  • Python序列內置類型之元組類型詳解 1.元祖的概念 Python中的元組與列表類似,都是一個序列,不同的是元組的元素不能修改而已。 2.元組的創建 元組使用小括弧,列表使用方括弧。 註意:元組中只包含一個元素時,需要在元素後面添加逗號,否則括弧會被當作運算符使用。 3.Python元組操作 1. ...
  • 跳槽不算頻繁,但參加過不少面試(電話面試、face to face面試),面過大/小公司、互聯網/傳統軟體公司,麵糊過(眼高手低,缺乏實戰經驗,掛掉),也面過人,所幸未因失敗而氣餒,在此過程中不斷查缺補漏,養成了踏實、追本溯源、持續改進的習慣,特此將自己經歷過、構思過的一些面試題記錄下來,如果答案有 ...
  • 當一個Action完成它的任務後,通常需要返回一個實現IActionResult的對象,而最常見的就是View或者ViewResult,所謂的視圖對象。那麼視圖與最終所看到的頁面之間的聯繫又是怎樣形成的,這便是本文想要探討的問題。 在ResourceInvoker類之中,可以找到下列的代碼。這些代碼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...