zoukankan      html  css  js  c++  java
  • 使用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;
        }
    }
  • 相关阅读:
    shell 时间循环
    t
    IntelliJ IDEA For Mac 快捷键
    JVM的默认参数
    qt不同模块使用多语言
    cocos2dx 实现gpu instancing
    so so.*.*
    Android开发-解决 AIDL 中找不到couldn't find import for class错误
    Android Watchdog源码简析--Based on Android 6.0.1
    View绘制流程--Based on kitkat
  • 原文地址:https://www.cnblogs.com/xkzy/p/3951684.html
Copyright © 2011-2022 走看看