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页面的更多相关文章

  1. 根据url下载图片和页面

    需要将&tp=webp&wxfrom=5去掉,既可以在任何地方显示,也可以下载了 http://mmbiz.qpic.cn/mmbiz_jpg/bf8pC39RBhGFOH1ib9Ac ...

  2. js通过 URL下载文件

    页面上一个button,点击之后触发一个function去请求数据,返回 pdf/epub 的URL,然后下载这个文件. 本来是直接用 a 写的,href里放资源地址,target设为'_blank' ...

  3. wget---从指定的URL下载文件

    wget命令用来从指定的URL下载文件.wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕.如果是服务器打断下 ...

  4. node.js入门学习(二)MIME模块,request和response对象,demo之不同url请求不同html页面,页面包含图片、样式css等静态资源

    一.构建http服务程序-根据不同请求做出不同响应 // 加载http模块 var http = require("http"); // 创建一个http服务对象 http.cre ...

  5. C++根据图片url下载图片

    需要使用到URLDownloadToFile()函数,该函数在头文件<urlmon.h>中声明. URLDownloadToFile()函数的定义如下: HRESULT URLDownlo ...

  6. 从指定的URL下载文件

    通过使用URLDownLoadToFile函数,我们能从指定的URL下载文件,保存到本地,并且下载的文件类型可以是可执行文件 实例如下,http://www.xuexic.com 的根目录下存在一个l ...

  7. Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端

    Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...

  8. 使用url下载网络图片以及流介绍

    使用url下载网络图片的时候,首先需要建立一个URL对象,然后使用一个输入流获取该URL中的内容.之后使用读取该输入流的内容,使用一个输出流写到本地文件中.最后关闭输入和输出流.下面是一个简单的下载代 ...

  9. QT实现,通过URL下载文件的接口实现

    今天来把坑填上. 具体就是提供一个URL,并通过这个URL下载文件. MyDownloader.h: #ifndef MYDOWNLOADER_H #define MYDOWNLOADER_H cla ...

随机推荐

  1. java怎样将一个List传入Oracle存储过程

    java怎样将一个List传入Oracle存储过程.样例例如以下: 数据库端建一个PL/SQL的数组. CREATE OR REPLACE TYPE tables_array AS VARRAY(10 ...

  2. 安装配置 Kafka Manager 分布式管理工具

    Kafka Manager 特性,它支持以下内容(官方译解): 管理多个群集容易检查集群状态(主题,消费者,偏移量,经纪人,副本分发,分区分配)运行首选副本选举使用选项生成分区分配,以选择要使用的代理 ...

  3. 【强网杯2018】Gamebox

    参考: https://www.cnblogs.com/hac425/p/9416787.html http://tacxingxing.com/2018/03/28/2018qwb/ 事后复盘pwn ...

  4. firework压缩图片类似于GD库中压缩图片的思路

    1.先建一张空白图片, 2.再把需要压缩的图片拖上去, 3.符合画布 4.调到需要的大小

  5. Java的Executor框架和线程池实现原理

    Java的Executor框架 1,Executor接口 public interface Executor { void execute(Runnable command); } Executor接 ...

  6. 【转】2018年EI收录中文期刊目录

    序号 中文刊名 收录情况 1 声学学报 保持收录 2 航空学报 保持收录 3 兵工学报 保持收录 4 自动化学报 保持收录 5 电子学报 保持收录 6 太阳能学报 保持收录 7 测绘学报 保持收录 8 ...

  7. HUAWEI HiAI亮相华为开发者生态大会 助力应用AI开发实现加速度

    6月23日,在2018华为终端·全球合作伙伴及开发者大会AI分论坛体验区的一角,被层层叠叠的人群围得水泄不通.站在最前面的一名体验者,正跟随着“快手短视频”APP上不断出现的小人左右扭动,每完成一个动 ...

  8. PHP中输出文件,怎么区别什么时候该用readfile() , fread(), file_get_contents(), fgets()

    我在服务器端(Apache环境)上放了一个安卓apk安装包的下载链接,使用readfile()读取apk文件输出下载后,手机安装apk显示解析包错误.但apk本身没问题,下载后文件的大小也是完整的.服 ...

  9. MongoDB 基本操作具体解释

    MongoDB 最大的特点是他支持的查询语言很强大,其语法有点类似于面向对象的查询语 言.差点儿能够实现类似关系数据库单表查询的绝大部分功能,并且还支持对数据建立索引. 最后因为 MongoDB 能够 ...

  10. EasyNVR H5直播流媒体解决方案前端构建之:如何播放自动适配RTMP/HLS直播播放

    之前在进行EasyNVR多屏开发的时候,由于多屏功能不需要在手机端展示出来(pc多播放为RTMP,手机端播放为HLS),因此只注意到了引用videojs来进行rtmp的播放.由于不同项目需求不同,对h ...