C# 爬蟲 、 網頁數據抓取 隨記

第一次用 C# 寫數據抓取,遇到各種問題。開始寫模擬登錄的時候發現有驗證碼,要突破驗證碼才能弄,好吧,然後去找驗證碼破解的代碼,弄了半天摸不着門,然後只能硬着頭皮繼續弄,看了一大堆代碼,也試了一大堆,發現都不通用,後來明白了點原理,首先去掉噪點,干擾線等等各種東西,然後還要將彩色的驗證碼轉成黑白,還要進行字體切割,如果字體有粘連,對於我們這些初學者(門外漢), 那還是放棄吧,切割之後再進行每一個每一個像素進行編碼,白色0,黑色1,好像是這樣,我也沒太懂,再讀取字體庫模型裏面的字進行對比,如果達到百分比多少以上,就卻認這個驗證碼是什麼,一個一個進行對比,最後就組成了一個完整的驗證碼,弄了一天發現我既不會弄字體庫,也不會用代碼切字,不可能完成驗證碼破解,所以就放棄了破解,另尋他法。

網上說驗證碼可能會保存在cookie裏面,好吧,抱着試試的態度去弄,模擬瀏覽器發送數據,請求驗證碼,FF調試, 發現cookie裏面還真有驗證碼,就這樣,驗證碼這個就過了,再來弄登錄。

登錄,首先要跟蹤目標網頁的邏輯,看它是怎麼傳遞參數登錄成功的。我這個就是先發送請求 加密用戶名和密碼,然後再把加密後的發送給後臺進行登錄,這個就沒啥說的。這期間遇到的問題就是發送請求,弄了半天不成功,原因就是那時發送的一個ajax請求,必須設置調用了哪個方法,網站找的一般都是直接請求後臺,而不是發出ajax請求,所以在這裏又瞎搗弄了一通。

關鍵代碼:

request.Headers.Add("X-AjaxPro-Method", "方法名");

登錄成功了之後,就是到了抓取頁面了,首先獲取到抓取頁面的html,再進行分析它是怎麼提交數據,怎麼返回的,都傳了些什麼參數等等。抓取頁面沒什麼問題,然後就是模擬查詢數據了,那網站是用asp.net寫的,有很多的隱藏域控件,所以發送請求的時候有非常多的參數,都不知道是幹嘛用的,反正我覺得有用的就只有查詢單號就可以了,模擬發送了半天都報500錯誤,這個就是模擬的參數有問題,服務器讀取不了,我把所有能設置都弄了一遍,一個一個對上,發現沒有什麼地方有錯誤,弄了2天,就卡在這裏了,是在沒辦法,後來偶然間發現,提交的數據和頁面隱藏域的數據有一點點不一樣,特殊字符都是進過轉碼了,然後就想了想以前寫的代碼傳參,發現傳數據的時候,都是需要經過 UrlEncode轉碼,再進行傳輸的,隱藏域的值雖然是控件自動生成的,但傳輸應該也還是需要轉碼,想到這 ,然後二話不說,就開始對參數進行轉碼

HttpUtility.UrlEncode(string);
居然成功了,太燒腦細胞了,雖然對些老手來說,可能這些都不知道一提,但第一次接觸還是有寫麻煩的。

對了,其中還遇到一個問題,就是讀取 html 之後獲取 字符串html裏面參數的問題,在頁面上當然好獲取,現在全是一堆字符串,真難搞,所以就找了個dll非常好用,支持 xpath ,和xmlDocument一樣用法,

部分代碼:

HtmlDocument htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(html.Replace("\r", "").Replace("\n", ""));
            HtmlNodeCollection collection = htmlDocument.DocumentNode.SelectSingleNode("/html/body/div").ChildNodes;

            foreach (HtmlNode htmlNode in collection)
            {
                var tempId = htmlNode.Attributes["id"].Value;
            }

標紅的部分就是 xpath 規則,

還可以根據屬性來獲取對應的節點:

htmlDocument.DocumentNode.SelectSingleNode("/html/body/div[2]/input[@id='__EVENTVALIDATION']");
這個是 :HtmlAgilityPack 下載地址:點擊打開鏈接

最好多看看這個網站的評論。裏面有許多人的問題,或許能幫到。

好了就寫這麼多,後面把代碼整理一下發上來,然後開始循環抓取數據了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章