C/C++: libcurl获取网页内容
2019独角兽企业重金招聘Python工程师标准>>>
安装:
$ sudo apt-get install libcurl3
$ sudo apt-get install libcurl4-openssl-dev
示例
来自 http://stackoverflow.com/questions/13905774/in-c-how-do-you-use-libcurl-to-read-a-http-response-into-a-string :
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>struct url_data {size_t size;char* data;
};size_t write_data(void *ptr, size_t size, size_t nmemb, struct url_data *data) {size_t index = data->size;size_t n = (size * nmemb);char* tmp;data->size += (size * nmemb);#ifdef DEBUGfprintf(stderr, "data at %p size=%ld nmemb=%ld\n", ptr, size, nmemb);
#endiftmp = (char*)realloc(data->data, data->size + 1); /* +1 for '\0' */if(tmp) {data->data = tmp;} else {if(data->data) {free(data->data);}fprintf(stderr, "Failed to allocate memory.\n");return 0;}memcpy((data->data + index), ptr, n);data->data[data->size] = '\0';return size * nmemb;
}char *handle_url(char* url) {CURL *curl;struct url_data data;data.size = 0;data.data = (char*)malloc(4096); /* reasonable size initial buffer */if(NULL == data.data) {fprintf(stderr, "Failed to allocate memory.\n");return NULL;}data.data[0] = '\0';CURLcode res;curl = curl_easy_init();if (curl) {curl_easy_setopt(curl, CURLOPT_URL, url);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);res = curl_easy_perform(curl);if(res != CURLE_OK) {fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));}curl_easy_cleanup(curl);}return data.data;
}int main(int argc, char* argv[]) {char* data;if(argc < 2) {fprintf(stderr, "Must provide URL to fetch.\n");return 1;}data = handle_url(argv[1]);if(data) {printf("%s\n", data);free(data);}curl_global_cleanup();return 0;
}
编译、运行:
$ gcc -g test.c -lcurl
$ ./a.out www.baidu.com
示例 (多线程)
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <stdlib.h>
#include <thread>struct url_data {size_t size;char* data;
};size_t write_data(void *ptr, size_t size, size_t nmemb, struct url_data *data) {size_t index = data->size;size_t n = (size * nmemb);char* tmp;data->size += (size * nmemb);#ifdef DEBUGfprintf(stderr, "data at %p size=%ld nmemb=%ld\n", ptr, size, nmemb);
#endiftmp = (char*)realloc(data->data, data->size + 1); /* +1 for '\0' */if(tmp) {data->data = tmp;} else {if(data->data) {free(data->data);}fprintf(stderr, "Failed to allocate memory.\n");return 0;}memcpy((data->data + index), ptr, n);data->data[data->size] = '\0';return size * nmemb;
}char *handle_url(char* url) {CURL *curl;struct url_data data;data.size = 0;data.data = (char*)malloc(4096); /* reasonable size initial buffer */if(NULL == data.data) {fprintf(stderr, "Failed to allocate memory.\n");return NULL;}data.data[0] = '\0';CURLcode res;curl = curl_easy_init();if (curl) {curl_easy_setopt(curl, CURLOPT_URL, url);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);res = curl_easy_perform(curl);if(res != CURLE_OK) {fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));}curl_easy_cleanup(curl);}return data.data;
}void threadFunc() {char *url = "www.baidu.com";char* data;data = handle_url(url);if(data) {printf("%s\n", data);free(data);}}int main(int argc, char* argv[]) {for(int i=0; i<10000; ++i){std::thread *t = new std::thread(threadFunc);t->join();delete t;}curl_global_cleanup();return 0;
}
g++ -std=c++11 test.cpp -lcurl -pthread
C++版本
有一个封装的库: https://github.com/jpbarrette/curlpp
转载于:https://my.oschina.net/letiantian/blog/754592
C/C++: libcurl获取网页内容相关推荐
- php get 返回源码,php源码 fsockopen获取网页内容实例详解
PHP fsockopen函数说明: Open Internet or Unix domain socket connection(打开套接字链接) Initiates a socket connec ...
- 【C#】获取网页内容及HTML解析器HtmlAgilityPack的使用
最近经常需要下载一些东西,而这个下载地址又会经过层层跳转,每个页面上都有很多广告,烦不胜烦,所以做了一个一键获得最终下载地址的小工具.使用C#,来获取网页内容,然后通过HtmlAgilityPack获 ...
- php 获取网页内容 四种方法
<?php //获取网页内容 //方法一 // $content = file_get_contents("http://bbs.zj.com");/ ...
- C#获取网页内容的三种方式
搜索网络,发现C#通常有三种方法获取网页内容,使用WebClient.WebBrowser或者HttpWebRequest/HttpWebResponse...方法一:使用WebClient (引用自 ...
- VC++中使用使用winnet类获取网页内容
2005-09-01 VC++中使用使用winnet类获取网页内容 - [VC专栏] 微软提供的Winnet类是一个应用层的网络通信组件, 它可以使你的应用程序很容易的实现http.ftp.gophe ...
- vbs获取html内容,VBS获取网页内容
VBS获取网页内容 2011年03月14日 功能:通过VBS获取远程网页的内容,并提取其中需要的部分(示例中提取股票信息) 以下为代码: 测试VBS获取网页内容 //如果提示权限问题可以设置IE选项, ...
- C语言 获取网页内容
参考来源:https://blog.csdn.net/xiahn1a/article/details/41680959 vc6 上编译通过 #include <winsock.h> #in ...
- php获取另一个网页内容,php获取网页内容的三种方法
本文介绍下,php实现获取网页内容的三种方法,有需要的朋友,参考下吧. 用php代码实现获取网页的原理: 将抓取内容,通过正则表达式过滤,得到想要的内容. 关于正则表达式的内容,程序员之家介绍了很多, ...
- php 抓取网站,php 获取网页内容的四种方法
1,使用xmlhttp对象,类似asp中的ActiveXObject对象. 代码: //获取网页内容 $xhr = new COM("MSXML2.XMLHTTP"); $xhr- ...
最新文章
- iOS NSObject对象内存大小
- 【转】linux之pmap命令!
- mysql导出单表数据
- linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)
- 作者:周武柏,男,美国佛罗里达国际大学计算机科学博士生,南京邮电大学计算机学院大数据项目组成员。...
- 优秀的功能测试也可以胜任技术测试者的工资
- android异步任务更新进度条,Android的AsyncTask异步任务浅析
- 使用spring session+redis技术,解决负载均衡下的session共享问题
- java 字符串拼接_不能用 + 拼接字符串? 这次我要吊打面试官!
- mac下安装win7虚拟机
- 服务器系统怎么设置从光盘启动,电脑BIOS怎么设置光盘启动 三种类型BIOS设置光驱启动的图文详解教程...
- initializing of server in progress as process 4656
- Linux进程间关系之终端与终端登录
- 企业智慧屏后 不止华为望向了智能办公市场
- 高等数学笔记-苏德矿-第九章-重积分(Ⅱ)-三重积分
- 【超好懂的比赛题解】2020ICPC澳门站 个人题解
- 验证码输入错误怎么再次刷新验证码
- 通道(channel)
- HTML中form表单的应用
- centos8 批量修改文件名字