c中使用libcurl抓取网页

果然用c来写http的东西就是不如php和python这样的方便,不过还好,发现c有个libcurl的库用起来感觉还不错。

可以看这里有很多libcurl的使用例子。先简单说到底用它来做什么呢,就是从网络层看,先是ip层,上面有tcp和udp层,再上面就是http层了,ip层你可以用raw socket来写,而tcp和udp呢就可以用相应的tcp和udp的socket来写,当然了http层呢,你自然可以用tcp的socket按照http的协议进行相应的解析发送收取神马的,所以用libcurl来写http层方面的东西就方便多了。

在libcurl里有简单的方便的api可以调用,给出url你可以取得网页的源代码,或者http头等。基本的用法就是可以看我下面的代码,基本上就是先进行总的初始化curl_global_init,然后用curl_easy_init得到处理的handle,用curl_easy_setopt可以设置选项比如写入什么东西啦,自动跳转啦之类的,然后curl_easy_perform运行,最后收尾工作curl_easy_cleanup整个流程就完成了。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <curl/curl.h>
  6. #include <pthread.h>
  7. const int MAXP=10;
  8. pthread_mutex_t mutex;
  9. size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream){
  10.   int written = fwrite(ptr, size, nmemb, (FILE *)stream);
  11.   return written;
  12. }
  13. void* geturl(void* url){
  14.   CURL* curl=curl_easy_init();
  15.   curl_easy_setopt(curl,CURLOPT_URL,url);
  16.   curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1);
  17.   curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);
  18.   char* s=(char*)malloc(strlen(url)+1);
  19.   memset(s,0,strlen(url)+1);
  20.   memcpy(s,(char*)url,strlen(url));
  21.   int i=0;
  22.   for(;i<strlen(s);++i)
  23.     if(!((s[i]>='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')))
  24.       s[i]='0';
  25.   FILE *file=fopen(s,"w");
  26.   if(!file){
  27.     printf("file create error\n");
  28.     curl_easy_cleanup(curl);
  29.     return ;
  30.   }
  31.   curl_easy_setopt(curl,CURLOPT_WRITEDATA,file);
  32.   curl_easy_perform(curl);
  33.   fclose(file);
  34.   curl_easy_cleanup(curl);
  35. }
  36. void* handle(void* arg){
  37.   char name[200];
  38.   while(1){
  39.     memset(name,0,sizeof name);
  40.     pthread_mutex_lock(&mutex);
  41.     if(scanf("%s\n",name)==EOF){
  42.       pthread_mutex_unlock(&mutex);
  43.       return NULL;
  44.     }
  45.     pthread_mutex_unlock(&mutex);
  46.     geturl((void*)name);
  47.   }
  48. }
  49. int main(int argc,char **argv){
  50.   curl_global_init(CURL_GLOBAL_ALL);
  51.   pthread_mutex_init(&mutex,NULL);
  52.   pthread_t p[MAXP];
  53.   freopen("in.txt","r",stdin);
  54.   int i=0;
  55.   for(;i<MAXP;++i)
  56.     pthread_create(&p[i],NULL,handle,NULL);
  57.   for(i=0;i<MAXP;++i)
  58.     pthread_join(p[i],NULL);
  59.   return 0;
  60. }
您可能喜欢:
我猜您可能还喜欢:
,

《c中使用libcurl抓取网页》有 3 条评论

Trackbacks/Pingbacks:

  1. 网络协议简介 | 吃杂烩
  2. Thought this was cool: CUDA编程入门 « CWYAlpha
  3. Thought this was cool: 打印自身的程序 « CWYAlpha

发表评论