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
- ... ...
- 在写函数时,头部有返回值而函数中实际无返回直,有时会出现段错误
设置好以上后,调用该函数执行 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;
}