21xrx.com
2024-12-22 22:58:16 Sunday
登录
文章检索 我的文章 写文章
C++如何获取网页内容?
2023-07-04 21:53:56 深夜i     --     --
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解析库来提取其中的信息。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复