乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      爬蟲/蜘蛛程序的制作(C#語言)上

       NaturalWill 2014-05-16

       問題是對某一網(wǎng)站或所有網(wǎng)站進行抓取,即下載所有網(wǎng)頁。怎么實現(xiàn)呢?

      先將問題最小化(轉(zhuǎn)化的思想,轉(zhuǎn)化為小規(guī)模,可以解決的問題):如果只有一個網(wǎng)頁,怎么下載?問題變地很簡單,只要用WebClient/WebRequest(甚至OpenFileDialog都可以)打開Url地址,將數(shù)據(jù)流存入本地存儲器的文件(以相應(yīng)的擴展名作為擴展名)即可。示例代碼如下:

      string BoardStream;//下載內(nèi)容存入此變量

      Uri url = new Uri( http://www.163.com );//將下載地址轉(zhuǎn)換為Uri類型

      HttpWebRequest requestPage = ( HttpWebRequest )WebRequest.Create( url );

      WebResponse response = requestMainPage.GetResponse();

      Stream stream = response.GetResponseStream();//獲取頁面流

      if( response.ContentType.ToLower().StartsWith( "text/" ) )//如果獲得成功(即為文本格式)

      {

          StreamReader reader = new StreamReader( stream , System.Text.Encoding.UTF8 );//讀取獲得內(nèi)容流

      BoardStream = reader.ReadToEnd();//將內(nèi)容流轉(zhuǎn)換為文本并存入變量BoardStream,即為所需要的數(shù)據(jù)流

      }

      StreamWriter saveAPage = new StreamWriter( C:/a.html , false , System.Text.Encoding.GetEncoding( "gb2312" ) );//實例化寫入類,保存路徑假設(shè)為C:/a.html

      saveAPage.Write(Rich.Text);//創(chuàng)建寫入任務(wù)

      saveAPage.Flush();//寫入文件(即清理緩存流)

      saveAPage.Close();//關(guān)閉寫入類的對象

      好了,這樣便完成了一個網(wǎng)頁的下載。最簡化問題解決!

       

      好了,下面的問題是,如何獲得更多的網(wǎng)頁?可以分兩步:

      1.    得到更多的地址

      2.    下載地址指向的鏈接內(nèi)容(和上面下載一頁的方法一樣)

      循環(huán)進行上面兩步即可以完成蜘蛛的全部功能了 ^_^

      要得到更多的地址,最好的辦法是模擬人使用網(wǎng)頁的辦法。我們平時怎么瀏覽整個網(wǎng)站?無非是從主頁依次點開各層鏈接而已。好了,思路出來了:

      分析已經(jīng)下載的主頁文本,提取其中所有的Url地址信息,再依次下載得到的Url地址指向的鏈接即可。

      現(xiàn)在網(wǎng)絡(luò)上有不少Web2.0的網(wǎng)站了,這對解析Url地址有不小的負面作用。在Web2.0出現(xiàn)前,所有的鏈接都是在HREF后面出現(xiàn)的,而現(xiàn)在卻沒有了這樣的關(guān)鍵字,地址可能出現(xiàn)于任何的關(guān)鍵字之后。怎么辦呢?

      經(jīng)過大量分析,筆者發(fā)現(xiàn):其實現(xiàn)在所有的鏈接還有一個共性,即都包裹在雙引號(””)當(dāng)中,這便對解析提供了極大的方便。筆者將鏈接分為兩類:

      1.    完整鏈接,即:http://www.163.com類,其前面有明顯的標(biāo)志http://,這樣的內(nèi)容很好提取,只要用String的靜態(tài)方法IndexOf()找出http://的位置以及從此位置算起第一個“”出現(xiàn)的位置(即鏈接結(jié)束的位置),再用SubString()方法將地址提取出來即可。

      2.    非完整鏈接,其形式一般為/index.htm,提取方法和完整鏈接的方法相同,只是判斷它是不是鏈接上有一定難度(因為屬性等其它信息也可能以“/”開頭,這時就很難判斷了。筆者采取的方法是試下載,即下載一下試試,如果超時剛不是,不超時剛是。注意:要在它的前面加上根地址,如“http://www.163.com/index.htm”。

       

      好了,我想蜘蛛的所有功能已經(jīng)實現(xiàn)了吧?嘿嘿^_^

      只是這樣一個蜘蛛程序怕是效率萬般低下,因為它只有一個線程,光解析下一層的鏈接都要花上不少時間,怎么辦呢?當(dāng)然是采取更優(yōu)化的辦法:多線程

       

      具體實現(xiàn)見《蜘蛛/爬蟲程序的多線程控制》一文(稍后在本Blog推出)。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多