C++:
下载网页

How to: 如何操作

#include <iostream>
#include <curl/curl.h>

size_t callback(void *contents, size_t size, size_t nmemb, std::string *s) {
  size_t newLength = size * nmemb;
  try {
    s->append((char*)contents, newLength);
  } catch(std::bad_alloc &e) {
    // Handle memory problem
    return 0;
  }
  return newLength;
}

int main() {
  CURL *curl;
  CURLcode res;
  std::string response;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

    res = curl_easy_perform(curl);
    if(CURLE_OK == res) {
      std::cout << response << '\n';
    } else {
      std::cerr << "CURL Error: " << curl_easy_strerror(res) << std::endl;
    }
    
    curl_easy_cleanup(curl);
  }
  return 0;
}

输出样例:

<!doctype html>
<html>
<head>
    <title>Example Domain</title>
...
</html>

Deep Dive 深入挖掘

下载网页不是什么新鲜事,在90年代早期web出现之初就已经有了。这个功能最初是通过命令行工具实现的,比如wgetcurl。后来,随着编程语言的发展,库如libcurl允许我们在代码中直接实施这些操作。

这里示范的libcurl,是一个非常流行的跨平台的库支持多种协议,比如HTTP、HTTPS和FTP等。它也提供了易于使用的API以及良好的文档支持。

其他选择包括 PocoBoost.Asio (两者支持HTTP客户端功能)。截止到2023年,Boost.Beast 这个库也是受欢迎的选择,它依赖于 Boost.Asio,且专注于网络。

实现时,注意一定要处理好内存和异常。示例中的错误处理非常基础,实际项目中可能需要更复杂的逻辑来处理网络异常和数据解析问题。

See Also 参考链接

记得,在真正使用这些库的时候,要去看看具体的文档和教程,确保用得地道。