您的位置:首页 > 编程语言 > C语言/C++

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

2014-07-24 18:45 543 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: