使用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;
    }
}

时间: 2024-08-04 14:11:51

使用libcurl,根据url下载对应html页面的相关文章

Android解决WebView的定位功能、视频全屏播放、下载功能、页面Url的处理、进度条处理

解决WebView的定位功能.视频全屏播放.下载功能.页面Url的处理.进度条处理 事先说明: 定位功能在安卓6.0需要用户手动确认权限后才能使用 若需在安卓6.0适配WebView的定位功能,则需要在WebView中手动增加用户权限访问 详细可百度安卓6.0权限管理系统,或者采用第三方封装好的权限管理类进行编写(如Bmob) 如果对内容不理解的话,可参考最后的整个类的代码 如果对BaseActivity这个抽象类不理解的话,可以查看下面一篇文章对BaseActivity的介绍 步骤一:webv

iw14.0.50来了,终于可以直接在地址栏输入url打开iw功能页面了;可以自由使用EasyUI等js框架了;显示模式对话框也不再七绕八绕惹人烦了;

示例代码已经放出!请移步使用delphi+intraweb进行微信开发1~4代码示例进行下载,虽为示例代码但是是从我项目中移出来的,封装很完备适于自行扩展和修改. iw14.0.50来了,在新的版本中最吸引我的就是增加了完善的httphandler功能:终于可以直接在地址栏输入url打开iw功能页面了:可以自由使用EasyUI等js框架了:显示模式对话框也不再七绕八绕惹人烦了:呵呵,我感觉iw第一次接近主流web开发工具了! 兴奋过了,来尝试一下吧.其实iw的坑还是挺多的,虽然已经接近主流了,但

URL 加载到页面的完整过程

(本图为:URL 加载到页面的完整过程) 今天小编带来这篇文章主要关于“从输入 URL 到页面加载完的过程中都发生了什么事情”这个主题来进行探讨下. 一个HTTP请求的过程 为了简化我们先从一个HTTP请求开始,简要介绍一下一个HTTP求情的网络传输过程,也就是所谓的“从输入 URL 到页面下载完的过程中都发生了什么事情” DNS Lookup 先获得URL对应的IP地址 Socket Connect 浏览器和服务器建立TCP连接 Send Request 发送HTTP请求 Content Do

从url下载图片--java与python实现方式比较

从url下载图片--java与python实现方式比较 博客分类: 技术笔记小点滴 javapython图片下载 一.java的实现方式 首先读取图片 Java代码   //方式一:直接根据url读取图片 private static BufferedImage read(String imageUrl) throws IOException { URL url = new URL(imageUrl); BufferedImage image = ImageIO.read(url); retur

防止通过URL下载文件

网页中向用户提供了ppt文件的下载功能,前提是只有登录的用户才能下载,所以需要禁止通过URL对文件进行下载. 自己定义一个文件下载类. using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.We

WebCollector下载整站页面(JAVA网络爬虫)

很多业务需要下载整站页面(有时为多个站点),将页面按照网站拓扑结构存放. 下面给出用JAVA爬虫WebCollector(2.09版本以上)爬取整站网页并按照网页拓扑结构存储到本地的代码. 代码中的抽取器可以作为一个插件复用. WebCollector的jar包可到官网下载:WebCollector官网.进入官网后下载webcollector-版本号-bin.zip,解压得到所需jar包. import cn.edu.hfut.dmic.webcollector.crawler.MultiExt

MFC通过URL下载并保存文件代码 转载

http://blog.csdn.net/charlessimonyi/article/details/8666108?utm_source=tuicool&utm_medium=referral 我们知道,windows有关网络连接的API在wininet.h里,而在MFC里,这些API被封装成了类. CInternetSession类:直接继承自CObject类,该类用来建立与某个Internet服务器的会话 CInternetConnection类:帮助用户管理与Internet服务器的连

JAVA 通过url下载图片保存到本地

//java 通过url下载图片保存到本地 public static void download(String urlString, int i) throws Exception { // 构造URL URL url = new URL(urlString); // 打开连接 URLConnection con = url.openConnection(); // 输入流 InputStream is = con.getInputStream(); // 1K的数据缓冲 byte[] bs

前端通过url下载文件方法

产生背景 浏览器通过url下载文件,当浏览器识别出资深能播放的资源文件,就不会走下载流程,会直接打开 解决方法 1.让后台转成请求的方式,输出文件流(如果想实现批量下载-因为浏览器会误判多文件下载是个攻击,可新建iframe通过src实现批量下载) 2.a标签, h5的download,仅仅限制当前域名下的文件下载,不同域名之下的,不会走下载,会直接打开浏览器能自动识别的资源文件 3.通过下面前端看似狗屎的代码解决 // 保存到本地并自动点击 function saveAs(data, name