c++ curl 的简单使用和从网页上抓取图片的代码

本文介绍了如何在C++中利用libcurl库进行网络请求,并重点讲解了curl_easy_setopt()函数的使用,包括设置URL、头部信息处理、超时时间等关键选项。同时,给出了抓取网页图片的代码示例,帮助开发者实现图片下载功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 简单配置

  • 安装curl
  • apt-get curl 
  • 安装c++的库 libcurl4-openssl-dev
  • apt-get libcurl4-openssl-dev

2. 写代码时几个重要函数的介绍

  • curl_easy_init () / curl_easy_cleanup ()
  • CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter) 
  • 这个函数最重要;http://curl.haxx.se/libcurl/c/curl_easy_setopt.html
  • CURLOPT_URL : 第三个参数设置为想要访问的URL
  • CURLOPT_HEADER : 文件头部信息是否可见第三个参数为不可见0
  • CURLOPT_HEADERFUNCTION : 当接收到头部信息时调用设置的回调函数
  • CURLOPT_VERBOSE : 是否报告异常0不接收
  • CURLOPT_TIMEOUT : 设置CURL允许执行的最长秒数
  • CURLOPT_DNS_CACHE_TIMEOUT : 设置超时,默认的DNS cache的超时时间为60秒
  • CURLOPT_WRITEFUNCTION : 设置内容写回的回调函数
  • CURLOPT_WRITEDATA : 设置内容将要写回的buffer
  • ... ...
  • 在写函数时,头部有返回值而函数中实际无返回直,有时会出现段错误

3. CURLcode curl_easy_porform(CURL *handle)

    设置好以上后,调用该函数执行 OK!


4. 抓取图片的代码

/*************************************************************************
	> File Name: image_read.h
	> Author: zhanglp
	> Mail: shixi_lipeng@staff.sina.com.cn
	> Created Time: 2014年07月24日 星期四 11时52分10秒
 ************************************************************************/

#ifndef _MY_IMAGE_READ_H_
#define _MY_IMAGE_READ_H_

#include <curl/curl.h>

namespace image {

    struct ImageBox {

        std::string image_id;
        std::string image_url;
        std::string content_0;
        std::string content_160x160;
        std::string content_150x100;
    };

    size_t SaveFile (void *buffer, size_t size, size_t nmemb, void *stream);

    class ImageReader {
 
        public:

            ImageReader ();
            ~ImageReader ();

            bool LoadImage (const std::string url);
            std::string GetContent (const std::string image_id, const std::string no);

        private:

            bool Init (void);
            CURL *curl_obj_;
            std::string url_font_;
            std::string url_mid_;
            std::string output_;
    };
}

#endif

/*************************************************************************
	> File Name: image_read.cpp
	> Author: zhanglp
	> Mail: shixi_lipeng@staff.sina.com.cn
	> Created Time: 2014年07月24日 星期四 11时59分33秒
 ************************************************************************/

#include <iostream>
#include "image_read.h"
#include "logging.h"


namespace image {

    ImageReader::ImageReader () {

        curl_obj_ = NULL;
        url_font_.append ("http://i0.gallery.yunstatic.com/httpgallery/?mediaid=");
        url_mid_.append ("&st=");
    }

    ImageReader::~ImageReader () {

        curl_easy_cleanup (curl_obj_);
    }

    size_t SaveFile (void *buffer, size_t size, size_t nmemb, void *stream) {
    
        std::string *tmp = (std::string*)stream;
        
        if (NULL == tmp) {

            LOG (ERROR) << "failed to be write.";
            return false;
        }
        tmp->append ((char*)buffer, size * nmemb);
        return size * nmemb;
    }

    bool ImageReader::LoadImage (const std::string url) {


        if (false == Init ())
            return false;

        curl_easy_reset (curl_obj_);
        curl_easy_setopt (curl_obj_, CURLOPT_URL, url.c_str ());
        curl_easy_setopt (curl_obj_, CURLOPT_HEADER, 0);
        curl_easy_setopt (curl_obj_, CURLOPT_VERBOSE, 0);
        curl_easy_setopt (curl_obj_, CURLOPT_TIMEOUT, 1500);
        curl_easy_setopt (curl_obj_, CURLOPT_DNS_CACHE_TIMEOUT, 60 * 60 * 72);
        curl_easy_setopt (curl_obj_, CURLOPT_WRITEFUNCTION, &SaveFile);
        curl_easy_setopt (curl_obj_, CURLOPT_WRITEDATA, &output_);

        CURLcode res = curl_easy_perform (curl_obj_);
        if (CURLE_OK != res)
            return false;

        return true;
    }

    bool ImageReader::Init (void) {

        curl_obj_ = curl_easy_init ();
        if (NULL == curl_obj_) {

            LOG (ERROR) << "failed to curl init.";
            return false;
        }
        return true;
    }

    std::string ImageReader::GetContent (const std::string image_id, const std::string no) {

        std::string url = url_font_ + image_id + url_mid_ + no;
        std::cout << url << std::endl;
        if (false == LoadImage (url)) {

            output_.clear ();
        }
        return output_;
    }
}

using image::ImageReader;
using image::ImageBox;

bool GetImageByImageID (ImageBox* image_box) 
{
    if (image_box->image_id.empty ()) {

        return false;
    }
  
    std::string ret;

    image::ImageReader  image;
    std::string  no ("1");
    image_box->content_0 = image.GetContent (image_box->image_id, no);
    no.clear (); no.append ("3");
    image_box->content_160x160 = image.GetContent (image_box->image_id, no);
    no.clear (); no.append ("4");
    image_box->content_150x100 = image.GetContent (image_box->image_id, no);
    
    if (image_box->content_0.empty () &&
        image_box->content_160x160.empty () &&
        image_box->content_150x100.empty ()
       ) {
           return false;
       }
    return true;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值