当前访客身份:游客 [ 登录 | 加入 OSCHINA ]

代码分享

当前位置:
代码分享 » C/C++  » 常用工具方法
分享到: 
收藏 +0
1
<无详细内容>
标签: <无>

代码片段(5) [全屏查看所有代码]

1. [图片] Capture.JPG    

2. [代码]GetPageByURL     跳至 [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     跳至 [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)     跳至 [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)     跳至 [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;
	}
}


开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

开源从代码分享开始 分享代码
RyanLee的其它代码 全部(9)...