21xrx.com
2025-03-26 12:26:07 Wednesday
文章检索 我的文章 写文章
C++如何获取网页内容?
2023-07-04 21:53:56 深夜i     16     0
C++ 获取 网页 内容 方法

要获取网页内容,我们首先需要了解HTTP协议。

HTTP(HyperText Transfer Protocol)是一种应用层协议,用于在Web浏览器和Web服务器之间传输数据。当我们打开一个网页时,浏览器会向服务器发送HTTP请求,服务器会返回HTTP响应。

在C++中,我们可以使用网络库来发送HTTP请求并获取响应。其中比较常用的网络库有libcurl和WinHTTP,下面我们分别介绍一下它们的用法。

1. libcurl

libcurl是一个非常流行的开源网络库,它支持多种协议,包括HTTP、FTP、SMTP等。在使用之前,我们需要下载和安装它。下载地址:https://curl.haxx.se/download.html

下面是使用libcurl获取网页内容的示例代码:

#include <curl/curl.h>
int main() {
  CURL* curl;
  CURLcode res;
  curl = curl_easy_init();
  if (curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://www.example.com");
    res = curl_easy_perform(curl);
    if (res != CURLE_OK) {
      fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
    }
    curl_easy_cleanup(curl);
  }
  return 0;
}

上面的代码中,我们先初始化一个CURL对象,然后使用curl_easy_setopt函数设置URL(需要获取内容的网页地址),最后调用curl_easy_perform函数发送HTTP请求并获取响应。响应内容将被储存在curl_easy_perform函数的返回值中。

2. WinHTTP

WinHTTP是一个Windows平台下的网络库,主要用于发送HTTP请求。它只支持HTTP和HTTPS协议。使用WinHTTP时,我们需要包含Windows.h头文件,并链接winhttp库。

下面是使用WinHTTP获取网页内容的示例代码:

#include <Windows.h>
#include <winhttp.h>
int main() {
  HINTERNET hOpen, hConnect, hRequest;
  DWORD dwSize = 0;
  BOOL bResult = FALSE;
  // 打开一个WinHTTP会话
  hOpen = WinHttpOpen(L"WinHTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
  // 建立连接
  if (hOpen) {
    hConnect = WinHttpConnect(hOpen, L"www.example.com", INTERNET_DEFAULT_HTTP_PORT, 0);
  }
  // 创建请求
  if (hConnect) {
    hRequest = WinHttpOpenRequest(hConnect, L"GET", L"/", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_REFRESH);
  }
  // 发送请求
  if (hRequest) {
    bResult = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
  }
  // 接收响应
  if (bResult) {
    bResult = WinHttpReceiveResponse(hRequest, NULL);
  }
  // 查询响应内容长度
  if (bResult) {
    bResult = WinHttpQueryDataAvailable(hRequest, &dwSize);
  }
  // 读取响应内容
  if (bResult) {
    LPSTR pszOutBuffer = new char[dwSize + 1];
    DWORD dwDownloaded = 0;
    do {
      bResult = WinHttpReadData(hRequest, (LPVOID)(pszOutBuffer + dwDownloaded), dwSize - dwDownloaded, &dwSize);
      if (!bResult)
        break;
      
      dwDownloaded += dwSize;
    } while (dwSize > 0);
    pszOutBuffer[dwDownloaded] = '\0';
    delete[] pszOutBuffer;
  }
  // 关闭句柄
  if (hRequest) {
    WinHttpCloseHandle(hRequest);
  }
  if (hConnect) {
    WinHttpCloseHandle(hConnect);
  }
  if (hOpen) {
    WinHttpCloseHandle(hOpen);
  }
  return 0;
}

上面的代码中,我们先打开一个WinHTTP会话,然后建立连接和创建请求,并发送请求和接收响应。接收响应后,我们可以使用WinHttpQueryDataAvailable函数查询响应内容长度,再使用WinHttpReadData函数读取响应内容。最后,我们需要关闭所有相关的句柄。

注意:在实际使用中,我们还需要对返回的响应内容进行解析和处理。如果响应内容为HTML格式,我们可以使用第三方的HTML解析库来提取其中的信息。

  
  

评论区