[1].[图片] Capture.JPG 跳至 [1] [2] [3] [4] [5]

[2].[代码] GetPageByURL 跳至 [1] [2] [3] [4] [5]

//static member variable define
string GetPageByURL::m_curPage = "";//当前保存的网页源码
CURL* GetPageByURL::m_curl = NULL;

/************************************************************************/
/* 函数名:Initialize
/* 功  能: 初始化libcurl库
/* 返回值:成功,返回true;失败,返回false
/************************************************************************/
bool GetPageByURL::Initialize()
{
	curl_global_init(CURL_GLOBAL_ALL);  
	m_curl = curl_easy_init();
	if (m_curl)
	{
		curl_easy_setopt(m_curl, CURLOPT_FOLLOWLOCATION, 1L);
		curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, WriteFunc);  
		curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &m_curPage);
	}
	else
	{
		MessageBoxA(NULL,"GetPageByURL::Initialize Failed!", "GetPageByURL::Initialize", MB_ICONERROR);
		return false;
	}
	return true;
}

/************************************************************************/
/* 函数名:WriteFunc
/* 功  能: libcurl会调用这个标准的函数,
/*				 size_t function( void *ptr, size_t size, size_t nmemb, void *userdata);
/*				 以提供格式化网页数据的机会
/*				 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteFunc); 
/* 返回值:返回buffer的大小
/************************************************************************/
size_t GetPageByURL::WriteFunc(char *data, size_t size, size_t nmemb, string *writerData)
{
	if (writerData == NULL)
		return 0;
	size_t len = size*nmemb;
	writerData->append(data, len);

	return len;
}

/************************************************************************/
/* 函数名:GetPage
/* 功  能: 根据url,抓取对应的网页源码;使用了libcurl库
/* 返回值:成功,返回包含网页源码的字符串;失败,返回空字符串
/************************************************************************/
bool GetPageByURL::GetPage(
														 const string& urlStr, //url字符串
														 string& page			  //输出参数,返回对应页面源码
														 )
{
	_ASSERT("" != urlStr);
	if(!m_curl)
	{
		MessageBoxA(NULL,"You must initialize curl first!", "GetPageByURL", MB_ICONERROR);
		return false;
	}

	m_curPage.clear();
	curl_easy_setopt(m_curl, CURLOPT_URL, urlStr.c_str());
	CURLcode res = curl_easy_perform(m_curl);
	if(res != CURLE_OK)
	{
		Utility::MessageBox(NULL, "GetPageByURL::GetPage", MB_ICONERROR, "Get the page of %s failed!", urlStr.c_str());
		return false;
	}
	else
	{
		page = m_curPage;
		return true;
	}
}

/************************************************************************/
/* 函数名:Cleanup
/* 功  能: 清理内存
/* 返回值:无
/************************************************************************/
void GetPageByURL::Cleanup()
{
	if(m_curl)
	{
		/* always cleanup */
		curl_easy_cleanup(m_curl);
		m_curl = NULL;
	}
}

[3].[代码] use it 跳至 [1] [2] [3] [4] [5]

//use GetPageByURL
	GetPageByURL::Initialize();
	string page = "";
	GetPageByURL::GetPage("http://www.oschina.net/p/curl",page);
	GetPageByURL::GetPage("http://www.oschina.net/",page);
	GetPageByURL::Cleanup();

[4].[文件] GetPageByURL.h ~ 407B    下载(169) 跳至 [1] [2] [3] [4] [5]

#pragma once
#include <curl/curl.h>

class GetPageByURL
{
public:
	GetPageByURL(void);
public:
	~GetPageByURL(void);
private:
	static string m_curPage;
	static CURL *m_curl;
private:
	static size_t WriteFunc(char *data, size_t size, size_t nmemb, string *writerData);
public:
	static bool Initialize();
	static bool GetPage(const string& urlStr, string& page);
	static void Cleanup();
};

[5].[文件] GetPageByURL.cpp ~ 3KB    下载(177) 跳至 [1] [2] [3] [4] [5]

#include "StdAfx.h"
#include "GetPageByURL.h"

//static member variable define
string GetPageByURL::m_curPage = "";//当前保存的网页源码
CURL* GetPageByURL::m_curl = NULL;

GetPageByURL::GetPageByURL(void)
{
}

GetPageByURL::~GetPageByURL(void)
{
}

/************************************************************************/
/* 函数名:Initialize
/* 功	 能: 初始化libcurl库
/* 返回值:成功,返回true;失败,返回false
/************************************************************************/
bool GetPageByURL::Initialize()
{
	curl_global_init(CURL_GLOBAL_ALL);  
	m_curl = curl_easy_init();
	if (m_curl)
	{
		curl_easy_setopt(m_curl, CURLOPT_FOLLOWLOCATION, 1L);
		curl_easy_setopt(m_curl, CURLOPT_WRITEFUNCTION, WriteFunc);  
		curl_easy_setopt(m_curl, CURLOPT_WRITEDATA, &m_curPage);
	}
	else
	{
		MessageBoxA(NULL,"GetPageByURL::Initialize Failed!", "GetPageByURL::Initialize", MB_ICONERROR);
		return false;
	}
	return true;
}

/************************************************************************/
/* 函数名:WriteFunc
/* 功  能: libcurl会调用这个标准的函数,
/*				 size_t function( void *ptr, size_t size, size_t nmemb, void *userdata);
/*				 以提供格式化网页数据的机会
/*				 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteFunc); 
/* 返回值:返回buffer的大小
/************************************************************************/
size_t GetPageByURL::WriteFunc(char *data, size_t size, size_t nmemb, string *writerData)
{
	if (writerData == NULL)
		return 0;
	size_t len = size*nmemb;
	writerData->append(data, len);

	return len;
}

/************************************************************************/
/* 函数名:GetPage
/* 功  能: 根据url,抓取对应的网页源码;使用了libcurl库
/* 返回值:成功,返回包含网页源码的字符串;失败,返回空字符串
/************************************************************************/
bool GetPageByURL::GetPage(
														 const string& urlStr, //url字符串
														 string& page			  //输出参数,返回对应页面源码
														 )
{
	_ASSERT("" != urlStr);
	if(!m_curl)
	{
		MessageBoxA(NULL,"You must initialize curl first!", "GetPageByURL", MB_ICONERROR);
		return false;
	}

	m_curPage.clear();
	curl_easy_setopt(m_curl, CURLOPT_URL, urlStr.c_str());
	CURLcode res = curl_easy_perform(m_curl);
	if(res != CURLE_OK)
	{
		Utility::MessageBox(NULL, "GetPageByURL::GetPage", MB_ICONERROR, "Get the page of %s failed!", urlStr.c_str());
		return false;
	}
	else
	{
		page = m_curPage;
		return true;
	}
}

/************************************************************************/
/* 函数名:Cleanup
/* 功  能: 清理内存
/* 返回值:无
/************************************************************************/
void GetPageByURL::Cleanup()
{
	if(m_curl)
	{
		/* always cleanup */
		curl_easy_cleanup(m_curl);
		m_curl = NULL;
	}
}