老蝸牛寫採集:網絡爬蟲(一)

搞採集,那第一步離不開的確定是蜘蛛,那咱們必須的科普一下,何爲網絡蜘蛛?html

網絡爬蟲

網絡爬蟲(又被稱爲網頁蜘蛛,網絡機器人,在FOAF社區中間,更常常的稱爲網頁追逐者),是一種按照必定的規則,自動地抓取萬維網信息的程序或者腳本。另一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲web

詳細本身搜百度百科windows

 

那話又說回來了,其實說網絡爬蟲,術語好像好像很高大上,其實不外乎寫一個http請求,而後到互聯網去抓取感興趣的數據。方式不外乎兩種:一種是帶有目的爬,而後抓取本身想要的數據,老牛寫的蜘蛛基本上屬於這種,這種蜘蛛也比較呆直萌。而另外一種就高大尚一點,基於搜索索引分類的蜘蛛,這種爬行永無終點,對於互聯網的一切數據都感興趣。簡直就是互聯網的搬運工。不理有沒有用,先採回來再說。基於老牛的道行和讀者的接受程度,咱們只能簡單的舉第一種的例子,基於目的的採集。瀏覽器

 

如何用C#寫一個爬蟲

爬蟲,必須得有本身的內核,內核是啥?一個強悍的http訪問組件,所幸的是微軟早已幫咱們準備了一個強悍的Net訪問組件HttpWebRequest。有朋友會說,那不是很簡單麼,隨便百度一下就知道怎麼去寫了,呃...網絡

那咱們就百度一下app

            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.cnblogs.com");
            using (WebResponse wr = req.GetResponse())
            {
                var stream = wr.GetResponseStream();
                using (System.IO.StreamReader sr = new System.IO.StreamReader(stream, Encoding.UTF8))
                {
                    var html = sr.ReadToEnd();
                }
            }

如無心外,經過以上代碼咱們能夠獲取到博客園首頁的html源碼,代碼簡單易懂,若是爬蟲就只獲取一段html代碼,那好像也沒什麼可說的。但咱們說過,咱們的爬蟲是基於必定目的去採集數據的。因此只能獲取一段html代碼並不能知足咱們的需求。或者說,咱們若是隻有能獲取某個網站的首頁,估計用處不大。那咱們應該怎麼去獲取咱們想要的頁面呢?這只是一個簡單的http GET方法,若是遇到POST怎麼辦?若是遇到windows身份認證?若是要記錄Cookie怎麼辦?假如目標網站防採集...問題會源源不斷的產生。固然只要花上必定時間,全部的問題都能在谷哥度娘找到答案,可是如何能省去一些碰壁的時間呢?這就是我這篇文章重點介紹的地方。機器學習

 

你必須知道的http頭

若是咱們要講http協議,估計講個幾小時也講不完,固然他也很簡單,但記住幾個重點,咱們即可以應付80%以上的可能。工欲善其事,必先利其器。咱們得找一個工具獲取http頭,否則講這個有點抽象。這個市面上全部的瀏覽器幾乎都有這樣工具,通常打開瀏覽器按F12就能夠看到,若是按F12沒反應!呃...百度一下「Firebug」工具

那咱們看看上面代碼實際產生的http頭,老牛用的是Chrome瀏覽器,若是你用其餘瀏覽器產生的結果不同屬正常現象學習

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
Host:www.cnblogs.com
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36

Accept 代表要接受的類型,通常默認爲text/html網站

Accept-Encoding 表示接收解碼格式,若是對方開啓了gzip則便使用gzip格式進行解碼

Accept-Language 接收語言,這對於多語言網站纔有用

Connection:keep-alive 長鏈接,基本上從Http 1.1開始就默認開啓

Host 這沒什麼可說的,域名

若是想知道HttpWebRequest的Http頭,只須要

req.Headers.ToString()

那如何跟Chrome瀏覽器的http頭同樣呢?

只需修改上面的代碼

            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.baidu.com");
            req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
            req.Headers.Add("Accept-Encoding", "gzip, deflate, sdch");
            req.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
            req.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36";
            using (WebResponse wr = req.GetResponse())
            {
                var stream = wr.GetResponseStream();
                using (System.IO.StreamReader sr = new System.IO.StreamReader(stream, Encoding.UTF8))
                {
                    var html = sr.ReadToEnd();
                }
            }

  

而後toString()看看http頭

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.113 Safari/537.36
Host: www.baidu.com
Connection: Keep-Alive

  

順序可能不一致,但不影響使用。

那爲啥要跟Chrome一致?其實不少狀況下,咱們不須要動http頭,但世界老是沒有這麼便宜的事,人家辛辛苦苦維護的網站就被你幾行代碼爬走了,因此做爲站長,怎麼也得預防一些居心不良的爬蟲採集本身的數據,因此有矛就有盾。至於怎麼防採集就不屬於這篇文章的範疇了,咱們要講的是如何寫好一個爬蟲,一個讓全部站長驚悚,厭惡的爬蟲。

 

到此爲止,咱們只講了簡單的get,那若是要實現登陸了?我要採集登陸後是數據了?還有獲取到html源碼,我怎麼抽離想要的數據等等,這些可能都是寫爬蟲的核心問題。由於基於篇幅考慮,我不想大範圍的解答以上問題,不少百度均可以找到。感受會無數的歧視眼光看過來,我褲子都脫了,你給我看這個,^_^

 

下一篇幅會介紹強悍的開源Http組件xNet

爲啥要用第三方的開源組件?由於HttpWebRequest底層是不公開的,有時候對付防採集會很頭疼,因此必須得基於Socket底層的組件才能方便咱們調試爲啥獲取不到html源碼或者爲啥獲取不到跟瀏覽器同樣的源碼。

國內也有基於HttpWebRequest組件的類庫,譬如蘇飛寫的HttpHelper,早期版本能夠免費獲得,最新版本要購買。

 

  C#.NET開源項目、機器學習、足球賽事資料庫 

  開源Q羣:302961959

  足球研究技術羣:142780296

相關文章
相關標籤/搜索