我试过查看 libcurl 网站上的简单示例,可在以下网址找到:http://curl.haxx.se/libcurl/c/simple.html ,但是我还没有想出如何做我需要的,即将页面的源存储在一个字符串变量中。
如有任何帮助,我们将不胜感激。
最佳答案
您很可能想调用 curl_easy_setopt
,带有 CURLOPT_WRITEFUNCTION 选项。这允许您使用此原型(prototype)提供函数:
size_t function( void *ptr, size_t size, size_t nmemb, void *userdata);
有数据时会调用哪个curl。然后,您可以使用 userdata
参数传入指向 std::string
(如果在 C++ 中)或 char **
的指针C,它允许您将数据保存到内存中。或者,您可以直接处理传入的数据,而无需完全存储它。
编辑: 这是我曾为 C++ 编写的这样一个函数(它使用 std::string
)这是我的代码,但是如果你需要许可信息,它是公共(public)领域——用它做任何你想做的事。 :-)
size_t curl_to_string(void *ptr, size_t size, size_t nmemb, void *data)
{
std::string *str = (std::string *) data;
char *sptr = (char *) ptr;
int x;
for(x = 0; x < size * nmemb; ++x)
{
(*str) += ptr[x];
}
return size * nmemb;
}
可能应该使用 C++ 风格的转换,但那时我还是一个年轻的程序员。 :-) 您可以像这样使用上面的内容:
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curl_to_string);
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &pagedata);
其中 pagedata
是一个 std::string
。在调用 curl_easy_perform
后,如果没有错误,pagedata
就会有您的页面。
编辑 2:
这个的 C 版本稍微复杂一些,主要是因为我们必须管理内存以适应传入的数据。 (像 std::string
和 std::vector
这样的东西在 C++ 中为我们做了...)
typedef struct
{
size_t size;
size_t allocated;
char *data;
} c_vector;
size_t curl_to_string(void *ptr, size_t size, size_t nmemb, void *data)
{
if(size * nmemb == 0)
return 0;
c_vector *vec = (c_vector *) data;
// Resize the data array if needed
if(vec->size + size * nmemb > allocated)
{
char *new_data = realloc(vec->data, sizeof(char) * (vec->size + size * nmemb));
if(!new_data)
return 0;
vec->data = new_data;
vec->allocated = vec->size + size * nmemb;
}
memcpy(vec->data + vec->size, ptr, size * nmemb);
vec->size += size * nmemb;
return size * nmemb;
}
它基本上是 C++ 的 std::vector
,归结为 C。(这样的事情就是为什么我默认是 C++ 程序员而不是 C...)
你可以这样调用它,
c_vector vec = {0};
curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, curl_to_string);
curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &pagedata);
注意上述代码中的错误;我只是证明了它是正确的,没有尝试过。
关于c - 如何在 C 中使用 libcurl 获取 HTML 页面源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5525613/