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整个流程就完成了。

#include 
#include 
#include 
#include 
#include 
#include 
const int MAXP=10;
pthread_mutex_t mutex;
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream){
  int written = fwrite(ptr, size, nmemb, (FILE *)stream);
  return written;
}
void* geturl(void* url){
  CURL* curl=curl_easy_init();
  curl_easy_setopt(curl,CURLOPT_URL,url);
  curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1);
  curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,write_data);
  char* s=(char*)malloc(strlen(url)+1);
  memset(s,0,strlen(url)+1);
  memcpy(s,(char*)url,strlen(url));
  int i=0;
  for(;i='0'&&s[i]<='9')||(s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')))
      s[i]='0';
  FILE *file=fopen(s,"w");
  if(!file){
    printf("file create error\n");
    curl_easy_cleanup(curl);
    return ;
  }
  curl_easy_setopt(curl,CURLOPT_WRITEDATA,file);
  curl_easy_perform(curl);
  fclose(file);
  curl_easy_cleanup(curl);
}
void* handle(void* arg){
  char name[200];
  while(1){
    memset(name,0,sizeof name);
    pthread_mutex_lock(&mutex);
    if(scanf("%s\n",name)==EOF){
      pthread_mutex_unlock(&mutex);
      return NULL;
    }
    pthread_mutex_unlock(&mutex);
    geturl((void*)name);
  }
}
int main(int argc,char **argv){
  curl_global_init(CURL_GLOBAL_ALL);
  pthread_mutex_init(&mutex,NULL);
  pthread_t p[MAXP];
  freopen("in.txt","r",stdin);
  int i=0;
  for(;i
											
您可能喜欢:
我猜您可能还喜欢:
,

有 3 条《c中使用libcurl抓取网页》的回复

Trackbacks/Pingbacks:

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

发表回复