Socket網路編程--網路爬蟲(1)

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   io   strong   

  我們這個系列準備講一下--網路爬蟲。網路爬蟲是搜尋引擎系統中十分重要的組成部分,它負責從互連網中搜集網頁,採集資訊,這些網頁資訊用於建立索引從而為搜尋引擎提供支援,它決定著整個引擎系統的內容是否豐富,資訊是否即時,因此其效能的優劣直接影響著搜尋引擎的效果。網路爬蟲的基本工作原理:

  (1)從一個初始URL集合中挑選一個URL,下載該URL對應的頁面;
  (2)解析該頁面,從該頁面中抽取出其包含的URL集合,接下來將抽取的URL集合再添加到初始URL集合中;
  (3)重複前兩個過程,直到爬蟲達到某種停止標準為止。

  當然作為才學網路編程不久的我肯定不能講那麼複雜的東西了。在這一小節我們將實現用C語言來下載一個網頁。

  實現下載一個網頁

 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <sys/types.h> 5 #include <sys/socket.h> 6 #include <unistd.h> 7 #include <netdb.h> 8 #include <netinet/in.h> 9 #include <arpa/inet.h>10 11 #define BUF_SIZE 409612 13 int main(int argc,char *argv[])14 {15     struct sockaddr_in servAddr;16     struct hostent * host;17     int sockfd;18     char sendBuf[BUF_SIZE],recvBuf[BUF_SIZE];19     int sendSize,recvSize;20 21     host=gethostbyname(argv[1]);22     if(host==NULL)23     {24         perror("dns 解析失敗");25     }26     servAddr.sin_family=AF_INET;27     servAddr.sin_addr=*((struct in_addr *)host->h_addr);28     servAddr.sin_port=htons(atoi(argv[2]));29     bzero(&(servAddr.sin_zero),8);30 31     sockfd=socket(AF_INET,SOCK_STREAM,0);32     if(sockfd==-1)33     {34         perror("socket 建立失敗");35     }36 37     if(connect(sockfd,(struct sockaddr *)&servAddr,sizeof(struct sockaddr_in))==-1)38     {39         perror("connect 失敗");40     }41 42     //構建一個http請求43     sprintf(sendBuf,"GET / HTTP/1.1 \r\nHost: %s \r\nConnection: keep-alive \r\n\r\n",argv[1]);44     if((sendSize=send(sockfd,sendBuf,BUF_SIZE,0))==-1)45     {46         perror("send 失敗");47     }48     //擷取http應答資訊49     memset(recvBuf,0,sizeof(recvBuf));50     while(recvSize=recv(sockfd,recvBuf,BUF_SIZE,0))51     {52         printf("%s",recvBuf);53         memset(recvBuf,0,sizeof(recvBuf));54     }55 56     return 0;57 }

  關於上面的構建HTTP請求的部分,可以參考網上資料或者我的部落格上也有簡單講解一些(瞭解HTTP協議 http://www.cnblogs.com/wunaozai/p/3733432.html)

  HTTP請求由三部分組成,分別是請求行,訊息前序,請求本文。我就簡單說一下上面用到的請求吧。首先GET / HTTP/1.1 表示使用GET請求方式擷取/(根目錄),使用的是http1.1版本(這個1.1好像用了很久,2.0已經開始推行了。)下一個是Host: 是發送請求資源的Internet主機和連接埠號碼。預設的連接埠號碼是80.好了一個看起來很複雜的http請求就這兩個是必須的,其他的可以不用寫的。你看是不是很容易啊。其他的參數等用到的時候在講好了。還有一個注意點,就是一個http請求的附加資訊是一行一個的。每一行我們要用\r\n表示斷行符號換行。而請求前序的結束標記是一個空行。所以你看上面的請求前序是以\r\n\r\n來結束的。

  接下來就來試一下我們這個程式到底能不能用。我們先在本地搭建一個http伺服器。放進去一個Hello World來看一下。

  上面那一大堆是響應(Respond)前序。第一行是,使用http1.1版本協議,此次的您的串連(用戶端)是200 OK 正常的。下一行是時間,伺服器用的是apache。第8行Content-Length: 86表示下面的html總共有86個位元組(不信,你數數看?)。下面再給一張部落格園的首頁的返回資訊。

  上面的程式我運行是有時會出現一個問題就是擷取的網頁不完整。不知道為什麼,然後我把BUF_SIZE改小一點為512就不會,也不知道為什麼。然後還有一個問題就是我拉取www.baidu.com 就不知道為什麼是活拉不了,不知道是不是因為我的請求前序太少的原因?

  參考資料:

  http://www.cnblogs.com/coser/archive/2012/06/29/2570535.html

  http://blog.csdn.net/gueter/article/details/1524447

  本文地址:

  http://www.cnblogs.com/wunaozai/p/3900134.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.