最近在摸索爬蟲相關的東西,寫點隨筆,以便忘記。html
目的與用途程序員
現實的項目中,咱們須要太多的第三方接口了。而每每這些第三方接口因爲條件限制,一時拿不到。web
譬如:瀏覽器
1. 淘寶網今天有什麼特價商品。服務器
2. 百度今天的熱搜榜是什麼。網絡
3. 某用戶的水電、話費、煤氣有沒有欠費,欠了多少。mvc
等等問題,怎麼辦呢?app
解決不了就請程序員出馬,由於程序員是萬能的,程序員是無敵的。dom
原理工具
既然咱們沒有能力(財力)與阿里巴巴、百度等第三方作對接,那麼咱們能夠經過模擬訪問他們對於的頁面,並抓取對應的數據,來收集相關的信息。
這裏,模擬是關鍵,也有不少細節要處理。後面我會一一講解。
工具
工欲善其事,兵線利器。 想要模擬訪問他人的網頁,爬取對應的數據, 那麼咱們首先要了解對應的網頁作了什麼動做,如何瞭解,這裏我介紹我用過的三種工具。
1. IE的開發人員工具
IE的開發人員工具,在打開IE的時候,按「F12」能直接呼出,並選擇「網絡」 > "開始捕捉"
對於抓包功能,須要IE的版本達到9或者9以上。 IE8不支持抓包功能。
優勢: IE自帶,很是方便。
缺點: IE9和IE11的界面風格還有點不同。 IE11對於數據的拷貝很是不方便。 IE9用着感受還行。至少數據能拷貝。 可是我有個較複雜的數據爬取,它竟然漏了關鍵的post。
建議: 只支持IE的網站,而且相對較簡單的數據爬取,能夠直接選擇此工具。
2. CHROME的開發人員工具
google的開發人員工具仍是不錯的。一樣的按F12能呼出,或者按 CTRL+Shift+I也能呼出。
一樣的選擇「網絡」 便可捕捉 操做當前頁面的數據包。
優勢: 瀏覽器自帶
缺點: 暫時沒發現。
3. httpwatch
前段時間的一次抓包,一直抓不到,後來想到多是IE開發人員工具的問題,下了這個試試。 結果挺不錯的。比較專業。
優勢: 抓包很全面
缺點: 須要自行安裝
若是是新手,我建議使用CHOROME的開發工具,或者httpwatch。
相關的類
原則上,只要實現HTTP協議的類,應該均可以, C#與抓包有關的類我用了2個,基本知足須要了。
WebClient 類,
此類使用很是簡單, 直接提交頁面參數與URL便可得到對應的頁面輸出內容。 可是若是涉及到客戶端與服務端的會話保持(如:須要登陸後才能看到的數據)的狀況,就無勇武之地了。對於WebClient的用法
HttpWebRequest & HttpWebResponse
這兩個類是較底層的類,若是須要與服務器保持會話。就須要靠這兄弟兩了。
據說其餘語言抓包相對簡單, 而C#相對繁瑣,也是由於她,誰讓他那麼底層的呢,並且據說還稍微有BUG,但我沒遇到。
HtmlAgilityPack
此類屬於第三方類,請自行百度。 固然也不必定須要用。 須要看作出的爬蟲須要爬的數據多很少,若是隻想獲取頁面中一兩個字段,徹底不須要用。
咱們知道,使用爬蟲爬出來的是一大串字符串, 但其實他就是html標記的字符串, 咱們很是但願用js來操做dom元素。 惋惜C#中,並無這樣的功能。而這個第三方類,就是實現了將html標記的字符串,直接轉換成了相似DOM同樣的對象。 這樣,咱們就能輕鬆獲取查找對應的數據值了。
hello world
因爲後面還會說到模擬登陸、文件傳輸等相關信息,這裏我用HttpWebRequest 類來講明。
以博客園首頁列表的數據爲例:
static void Main(string[] args) { string html= Hello(); Console.WriteLine(html); Console.Read(); } static string Hello() { //列表數據,通常經過抓包工具,點擊下一頁,來發現共同的規則,從而找到對應的URL string url = "http://www.cnblogs.com/mvc/AggSite/PostList.aspx"; //根據抓包工具,獲取須要POST的數據, 並分析對應的數值, 明細這裏PageIndex:1 是指第二頁。其餘的暫不作分析 string postData = "{ \"CategoryType\":\"SiteHome\",\"ParentCategoryId\":0,\"CategoryId\":808,\"PageIndex\":1,\"TotalPostCount\":4000,\"ItemListActionName\":\"PostList\"}"; //1.構建Request HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST";// POST OR GET, 若是是GET, 則沒有第二步傳參,直接第三步,獲取服務端返回的數據 req.AllowAutoRedirect = false;//服務端重定向。通常設置false req.ContentType = "application/x-www-form-urlencoded";//數據通常設置這個值,除非是文件上傳 //2.同過流的形式,傳輸參數。 byte[] postBytes = Encoding.UTF8.GetBytes(postData); req.ContentLength = postBytes.Length; Stream postDataStream = req.GetRequestStream(); postDataStream.Write(postBytes, 0, postBytes.Length); postDataStream.Close(); //3. 獲取服務器端的返回數據。 HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); string html = new StreamReader(resp.GetResponseStream()).ReadToEnd(); return html; }
最簡單的模擬抓包,主要3步
1. 構建HttpWebRequest。
2. 構建須要傳輸的參數
3. 獲取HttpWebResponse
參考文獻:
http://www.cnblogs.com/hambert/p/6118299.html
http://www.crifan.com/emulate_login_website_using_csharp/
https://q.cnblogs.com/q/67303/