使用libcurl,根据url下载对应html页面
1. [图片] Capture.JPG
2. [代码]GetPageByURL
//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
//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
#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
#include "StdAfx.h"
#include "GetPageByURL.h"
//static member variable define
string GetPageByURL::m_curPage = "";//当前保存的网页源码
CURL* GetPageByURL::m_curl = NULL;
GetPageByURL::GetPageByURL(void)
{http://www.enterdesk.com/special/shouhui/
}手绘图片
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;
}
}
使用libcurl,根据url下载对应html页面的更多相关文章
- 根据url下载图片和页面
需要将&tp=webp&wxfrom=5去掉,既可以在任何地方显示,也可以下载了 http://mmbiz.qpic.cn/mmbiz_jpg/bf8pC39RBhGFOH1ib9Ac ...
- js通过 URL下载文件
页面上一个button,点击之后触发一个function去请求数据,返回 pdf/epub 的URL,然后下载这个文件. 本来是直接用 a 写的,href里放资源地址,target设为'_blank' ...
- wget---从指定的URL下载文件
wget命令用来从指定的URL下载文件.wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕.如果是服务器打断下 ...
- node.js入门学习(二)MIME模块,request和response对象,demo之不同url请求不同html页面,页面包含图片、样式css等静态资源
一.构建http服务程序-根据不同请求做出不同响应 // 加载http模块 var http = require("http"); // 创建一个http服务对象 http.cre ...
- C++根据图片url下载图片
需要使用到URLDownloadToFile()函数,该函数在头文件<urlmon.h>中声明. URLDownloadToFile()函数的定义如下: HRESULT URLDownlo ...
- 从指定的URL下载文件
通过使用URLDownLoadToFile函数,我们能从指定的URL下载文件,保存到本地,并且下载的文件类型可以是可执行文件 实例如下,http://www.xuexic.com 的根目录下存在一个l ...
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...
- 使用url下载网络图片以及流介绍
使用url下载网络图片的时候,首先需要建立一个URL对象,然后使用一个输入流获取该URL中的内容.之后使用读取该输入流的内容,使用一个输出流写到本地文件中.最后关闭输入和输出流.下面是一个简单的下载代 ...
- QT实现,通过URL下载文件的接口实现
今天来把坑填上. 具体就是提供一个URL,并通过这个URL下载文件. MyDownloader.h: #ifndef MYDOWNLOADER_H #define MYDOWNLOADER_H cla ...
随机推荐
- Wireshark网络分析实战笔记(三)基本信息统计工具的使用方法
Capture File Properties:获取网络中数据包的整体信息 用法:Statistics菜单条下Capture File Properties选项 Protocol Hierarchy: ...
- 怎样推断server为虚拟机还是物理真机?
dmidecode |grep -A20 "Memory Device$"|sed -n -e'/Locator/p' -e '/Size/p'|grep -v "Ban ...
- 成都传智播客Java/PHP培训就业率高
依据传智播客的数据统计,传智播客的学员有五分之中的一个的能在毕业前找到惬意的工作,一半的学员能在毕业后一个月之内找到惬意的工作,一般在毕业后两个月之内绝大多数同学都能找到惬意的工作.而且传智播客毕业学 ...
- 【Excle数据透视表】如何隐藏数据透视表中行字段的”+/-”按钮
如下图:新建的数据透视表中有存在"+/-"符号,导致数据透视图不太美观,那么怎么处理呢? 解决方案 单击"显示"组中的"+/-"按钮显示或隐 ...
- mybatis数据查询返回值
查询: 返回值是整数. 小于0是查询的数据不存在,大于0是查询的数据已经存在. 修改: 返回值是整数. 大于0是修改的数据成功,否则就是失败. 添加: 和修改同理.
- OpenCV视频读取播放,视频转换为图片
转载请注明出处!!! http://blog.csdn.net/zhonghuan1992 OpenCV视频读取播放,视频转换为图片 介绍几个有关视频读取的函数: VideoCapture::Vide ...
- Highcharts使用表格数据绘制图表
Highcharts使用表格数据绘制图表 在Highcharts中,同意用户使用网页中现有的表格数据作为数据来源,然后依据该数据来源绘制图表.对于一个典型的HTML表格.当中,第一列的数据会作为x轴刻 ...
- 使用OpenGL进行Mandelbrot集的可视化
Mandelbrot集是哪一集?? Mandelbrot集不是哪一集!! 啊不对-- Mandelbrot集是哪一集!! 好像也不对-- Mandelbrot集是数集!! 所以--他不是一集而是数集? ...
- linux uart驱动——相关数据结构以及API(二)
一.核心数据结构 串口驱动有3个核心数据结构,它们都定义在<#include linux/serial_core.h>1.uart_driver uart_driver包 ...
- firfox浏览器常用快捷键
Ctrl + 数字键来打开第N个标签页这种还要先数完再到键盘上找数字Ctrl + Page Up = 激活左边一个标签页Ctrl + Page Down = 激活右边一个标签页Ctrl + Tab = ...