当前位置:   article > 正文

C++获取网页源代码_c++ 获取网页源代码

c++ 获取网页源代码
  1. Windows VC下的做法:

  2. #include <stdio.h>  
  3. #include <afxinet.h>  
  4.    
  5. int main(int argc, char* argv[])  
  6. {  
  7.     CInternetSession session("HttpClient");  
  8.     char * url = " http://www.imobile.com.cn/simcard.php?simcard=1392658";  
  9.     CHttpFile* pfile = (CHttpFile *)session.OpenURL(url);  
  10.       
  11.     DWORD dwStatusCode;  
  12.     pfile -> QueryInfoStatusCode(dwStatusCode);  
  13.     if(dwStatusCode == HTTP_STATUS_OK)  
  14.     {  
  15.         CString content;  
  16.         CString data;  
  17.         while (pfile -> ReadString(data))  
  18.         {  
  19.             content  += data + "\r\n";  
  20.         }  
  21.         content.TrimRight();  
  22.         printf(" %s\n " ,(LPCTSTR)content);  
  23.     }   
  24.     pfile -> Close();  
  25.     delete pfile;  
  26.     session.Close();  
  27.       
  28.     return   0 ;  
  29. }  

Windows下用socket:
#include <string>
#include <iostream>
#include <fstream>
#include "winsock2.h"
#include <time.h>

#pragma comment(lib, "ws2_32.lib") 

using namespace std;

#define DEFAULT_PAGE_BUF_SIZE 1048576

void main()
{
    WSADATA wsaData;
    int err;
    err = WSAStartup(MAKEWORD(2,2), &wsaData);
    if( err != 0 )
    {
        return;
    }

    // timer is start

    clock_t start, finish;
    double duration;
    start = clock();

    char host[] = "www.sina.com.cn";
    char *request = "GET / HTTP/1.0\r\nHost: www.sina.com.cn\r\nConnection: Close\r\n\r\n";

    struct hostent *hp;
    hp = gethostbyname(host);
    if(hp == NULL)
    { 
        cout << "gethostbyname() error in GetIpByHost: " << host << endl;
        return;
    }
    
    // 获取域名对应的IP

    struct in_addr inAddr;
    LPSTR lpAddr;
    lpAddr = hp->h_addr;
    memmove(&inAddr,lpAddr,4);

    int sock, ret = 0, optval = 1;
    struct sockaddr_in sa;
    sa.sin_family = AF_INET;        
    sa.sin_port = htons(80);
    sa.sin_addr.s_addr = inet_addr(inet_ntoa(inAddr));
    
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    connect(sock, (SOCKADDR*)&sa, sizeof(sa));
    if(sock == -1)
    {
        return;
    }
    if(sock == -2)
    {
        return;
    }

    // send the "GET" data

    ret = send(sock, request, strlen(request), 0);

    // 网页内容长度。可以从http头部数据中获取 "Content-Length:"

    int m_nContentLength = DEFAULT_PAGE_BUF_SIZE;
    
    char *pageBuf;
    pageBuf = (char *)malloc(m_nContentLength);
    memset(pageBuf, 0, m_nContentLength);

    int bytesRead = 0;
    while(ret > 0)
    {
        ret = recv(sock, pageBuf + bytesRead, m_nContentLength - bytesRead, 0);
        
        if(ret > 0)
        {
            bytesRead += ret;
        }
    }
    pageBuf[bytesRead] = '\0';

    cout << bytesRead << endl;

    // write the html content to the file

    ofstream ofs;
    ofs.open("ofs.txt");
    ofs << pageBuf << endl;

    ofs.close();
    free(pageBuf);
    closesocket(sock);
    WSACleanup();

    // timer is finish

    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    cout << "have cost " << duration << " seconds\n";
    
    return;
}



其他如不从缓存中读取内容及如何使用代理连接现在就不说了,可以参考下面的链接,或者下次补上。另外不妨看看 Java 是如何读取 URL 内容的,更简单
  1. GetMethod httpMethod = new GetMethod("http://unmi.blogcn.com");  
  2. int statusCode = new HttpClient().executeMethod(httpMethod);  
  3. if(statusCode == HttpStatus.SC_OK)  
  4. {  
  5.     System.out.println(httpMethod.getResponseBodyAsString());  
  6. }  
  7. httpMethod.releaseConnection();  

内容取过来之后,总是希望从中拣出需要的数据,可惜 VC6 中没有自己的正则表达式库,所以下一步要学用 boost 的正则表达式库。


Linux 下最简单,三种办法:

如果在C程序想抓取网页内容,比如百度
方法1. 执行System("wget http://www.baidu.com -q -O baidu.html"),然后再分析baidu.html。
方法2. system(curl http://www.baidu.com)
方法3. 直接写socket程序获取 http://www.baidu.com 的内容存入buffer中。


参考链接: 1.  VC++6.0 通过HTTP方式获取网页
         2.  CInternetSession获取网页内容的问题

         3. 利用CInternetSession从网站获取信息,并利用CString拆分查找特定信息


转载自:http://blog.chinaunix.net/uid-521083-id-2109153.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/339511
推荐阅读
相关标签
  

闽ICP备14008679号