Linux下C语言用socket获取网页源码

来源:互联网 发布:淘宝qq群推广抽成 编辑:程序博客网 时间:2024/05/21 07:08
第一个为利用linux下的工具来获取网页源码,我用的是Wget,也可以使用Curl,curl的话更加的灵活,可以设置很多参数
C++代码
//通过Wget来获取网页   
  1. string GetHtmlByWget(string url)   
  2. {   
  3.     //获取待下载网页文件名   
  4.     string fileName url.substr((int)url.find_last_of("/"1);   
  5.     if(fileName != "")   
  6.     {   
  7.         string strCom "wget -q "//wget命令,-q表示不显示下载信息   
  8.         strCom.append(url);   
  9.         system(strCom.c_str()); //执行wget   
  10.   
  11.         ifstream fin(fileName.c_str());   
  12.         if(!fin)   
  13.         {   
  14.             return "";   
  15.         }   
  16.         string strHtml "";   
  17.         char chTemp[1024] "";   
  18.         //读取网页文件到内存中   
  19.         while(fin.getline(chTemp 1024))   
  20.         {   
  21.             strHtml.append(string(chTemp));   
  22.             strcpy(chTemp "");   
  23.         }   
  24.         fin.close();   
  25.         strCom "rm -f " //删除文件命令,-f表示直接删除不做任何提示   
  26.         strCom.append(fileName);   
  27.         system(strCom.c_str()); //删除刚才下载下来的文件   
  28.         return strHtml; //返回网页源码   
  29.     }   
  30.     else  
  31.     {   
  32.         return "";   
  33.     }   
  34.  



第二个是用的socket的来获取源码
C++代码 
//通过GET获取网页源码  
string GetHtmlByGet(string url)  
 
    string strHtmlContent = "";  
    int sockfd;  
    struct sockaddr_in addr;  
    struct hostent *pURL;  
    char text[RECVBUF];  
 
    //分析链接  
    UrlInfo urlInfo = ParseURL(url);  
    string sAccept = "Accept: **\r\nAccept-Language: zh-cn\r\nAccept-Encoding: gzip, deflate";
    //不同的主机UserAgent不同
    string sUserAgent = "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10";
    //将端口转换为字符串
    char t[6];
    string  strPort;
    sprintf(t,"%d", urlInfo.Port);
    strPort = t;
    //构造发送字符串
    string strRequest = "";
    strRequest.append("GET ");
    strRequest.append(urlInfo.File);
    strRequest.append("?");
    strRequest.append(urlInfo.Body);
    strRequest.append(" HTTP/1.1\r\n");
    strRequest.append(sAccept);
    strRequest.append("\r\nUser-Agent:");
    strRequest.append(sUserAgent);
    strRequest.append("\r\nHost:");
    strRequest.append(urlInfo.Host);
    strRequest.append(":");
    strRequest.append(strPort);
    strRequest.append("\r\nConnection: Keep-Alive\r\n\r\n");

    char* host = const_cast<char*>(urlInfo.Host.c_str());
    sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //TCP方式发送
    pURL = gethostbyname(host);
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = *((unsigned long*)pURL->h_addr);
    addr.sin_port = htons(80);

    //连接
    connect(sockfd,(struct sockaddr *)&addr,sizeof(addr));
    //发送
    send(sockfd, const_cast<char*>(strRequest.c_str()), strRequest.length(), 0);
    //接受
    while(recv(sockfd, text, RECVBUF, 0) > 0)
    {
        strHtmlContent.append(text);
        bzero(text,RECVBUF);
    }
    //关闭socket
    close(sockfd);
    //返回接受结果
    return strHtmlContent;
}

  1. 使用libcurl
    1. Java代码 复制代码 收藏代码
      1. #include <stdio.h>    
      2.  #include <string.h>    
      3.  #include <curl/curl.h>    
      4.   
      5.  #define MAX_BUF     65536    
      6.   
      7.  char wr_buf[MAX_BUF+1];    
      8.  int  wr_index;    
      9.   
      10.      
      11.  size_t write_data( void *buffer, size_t size, size_t nmemb, void *userp    
      12.     
      13.   int segsize size nmemb;    
      14.   
      15.       
      16.   if wr_index segsize MAX_BUF    
      17.     *(int *)userp 1   
      18.     return 0   
      19.      
      20.   
      21.       
      22.   memcpy( (void *)&wr_buf[wr_index], buffer, (size_t)segsize );    
      23.   
      24.       
      25.   wr_index += segsize;    
      26.   
      27.       
      28.   wr_buf[wr_index] 0   
      29.   
      30.       
      31.   return segsize;    
      32.     
      33.   
      34.   
      35.      
      36.  int main( void    
      37.     
      38.   CURL *curl;    
      39.   CURLcode ret;    
      40.   int  wr_error;    
      41.   
      42.   wr_error 0   
      43.   wr_index 0   
      44.   
      45.       
      46.   curl curl_easy_init();    
      47.   if (!curl)    
      48.     printf("couldn't init curl\n");    
      49.     return 0   
      50.      
      51.   
      52.       
      53.   curl_easy_setopt( curl, CURLOPT_URL, "www.exampledomain.com" );    
      54.   
      55.       
      56.   curl_easy_setopt( curl, CURLOPT_WRITEDATA, (void *)&wr_error );    
      57.   curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, write_data );    
      58.   
      59.       
      60.   ret curl_easy_perform( curl );    
      61.   
      62.   printf( "ret %d (write_error %d)\n"ret, wr_error );    
      63.   
      64.       
      65.   if ret == 0 printf( "%s\n"wr_buf );    
      66.   
      67.   curl_easy_cleanup( curl );    
      68.   
      69.   return 0   
      70.    
原创粉丝点击