【问题标题】:C++ libcurl - Can't retrieve whole html content from URLC++ libcurl - 无法从 URL 检索整个 html 内容
【发布时间】:2018-08-17 15:34:55
【问题描述】:

使用 C++libcurl 库,我试图以这种方式从该网站https://www.nutritionix.com/food/Banana 获取完整的 HTML:

int main(){
   std::string content;
   curl_global_init(CURL_GLOBAL_ALL);
   CURL *curl = nullptr;
   curl = curl_easy_init();
   if (curl) {
       curl_easy_setopt(curl, CURLOPT_URL, "https://www.nutritionix.com/food/Banana" );
       curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
       curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
       curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
       CURLcode code = curl_easy_perform(curl);
       curl_easy_cleanup(curl);
   }
   curl_global_cleanup();
   std::cout << content << std::endl;
   system("pause");
}

writer函数是这样定义的:

static int writer(char *data, size_t size, size_t nmemb, std::string *writerData) {
   if (writerData == NULL)
       return 0;
   writerData->append(data, size*nmemb);
   return size * nmemb;
}

通过这种方式,我只能获取少量 HTML 代码,但是如何检索完整的 HTML 内容以在稍后阶段对其进行解析?

【问题讨论】:

  • 试试http://,否则你需要SSL支持。
  • 好的,谢谢您的回答。无论如何,使用http://,我得到的更少。
  • 那就试试CURLOPT_FOLLOWLOCATION
  • @nicoperillo 我用完整的解释和示例更新了我的答案
  • @Axalo 我刚刚编辑了我的代码,现在还有一个CURLOPT_FOLLOWLOCATION。这是你的意思吗?无论如何结果不会改变。

标签: c++ screen-scraping libcurl


【解决方案1】:

您不能,或者更好的说法是:您拥有网站调用的整个 html 内容。

现代网站上的简单 http 请求只会返回一些 70 字符长的响应以及一些脚本和元数据。脚本在加载时执行,之后会填满页面内容。

自己试试

这是执行上述代码后字符串包含的内容

【讨论】:

  • 好吧,我明白了,实际上我得到的只是一堆脚本和元数据。所以我认为实现我的目标的最好方法是从我的 C++ 中执行一个已经可以工作的 Python 脚本。
  • Korni,创建一个 XMLHTTPREQUEST 来从网站上检索我需要的信息是个好主意吗(在您看来)?我像你说的那样分析了 Chrome 中的网络面板,我注意到我需要发出 XHR 请求以获取有关“营养素”的数据。我可以使用 libcurl 做到这一点吗?
  • 我不能说对不起
猜你喜欢
  • 2015-02-06
  • 1970-01-01
  • 2018-05-20
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
相关资源
最近更新 更多