在以前的文章《curl使用小記(一)》中論述了命令行工具curl的基本使用。除此以外,curl還提供了可以直接供程序調用的模塊庫接口libcurl。這裏就經過一個遠程下載網絡上的一個圖片的實例,講述libcurl的使用。html
libcurl庫仍是推薦直接找已經編譯好的,由於是C程序接口,因此仍是比較穩定的。ios
libcurl雖然用起來比較繁複,但大概能夠就初分爲4類函數:編程
其中curl_easy_setopt最爲繁複,curl有超多的配置選項能夠選擇,可是基本上能夠跟curl命令行工具的參數選項對應起來。具體實例以下,可參看註釋說明:瀏覽器
#include <iostream> #include <curl/curl.h> using namespace std; size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream) { size_t written = fwrite(ptr, size, nmemb, (FILE *)stream); return written; } //顯示文件傳輸進度,dltotal表明文件大小,dlnow表明傳輸已經完成部分 //clientp是CURLOPT_PROGRESSDATA傳入的值 int progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow){ if (dltotal != 0) { printf("%lf / %lf (%lf %%)\n", dlnow, dltotal, dlnow*100.0 / dltotal); } return 0; } int main() { const char *netlink = "http://cn.bing.com/th?id=OHR.GrandsCausses_EN-CN3335882379_800x480.jpg"; const char *output = "dst.jpg"; curl_global_init(CURL_GLOBAL_ALL); //初始化全局資源 CURL *curl = curl_easy_init(); //初始化句柄 //須要的話,能夠設置代理 curl_easy_setopt(curl, CURLOPT_PROXY, "127.0.0.1:1080"); //訪問網址 curl_easy_setopt(curl, CURLOPT_URL, netlink); //設置用戶代理 curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"); //注意以二進制打開 FILE *fp = nullptr; if (fopen_s(&fp, output, "wb") != 0) { curl_easy_cleanup(curl); return 0; } //寫出數據 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); //實現下載進度 curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false); curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback); curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, nullptr); //運行 curl_easy_perform(curl); curl_easy_cleanup(curl); //釋放句柄 fclose(fp); curl_global_cleanup(); //釋放全局資源 return 1; }
這個實例訪問了網上的一個圖片資源,設置了一個代理,而且假裝成瀏覽器訪問,並將其圖片下載到本地。最後還實現了下載進度的顯示:
服務器
須要注意的是我試過不少圖片資源,並非全部的圖片資源都可以正常訪問到而且下載的。這裏面的緣由是一方面網站服務器就作了相關的設置,好比博客網站上的圖片資源就不容許外鏈,我這裏下載博客網站上的圖片就失敗了;另外一方面是curl的配置項並無作好完善的配置,服務器不會接受一些不合規的配置請求訪問,畢竟請求都是消耗資源的,如今的正規網站都會作一些反爬蟲的設置。網絡