Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988899
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类:

2012-09-03 14:41:55

历史数据源的问题查了很久,一个是sina提供一个webservice,但是并不好用,只有图片和一些基本信息。最后查到了这个yahoo的api,比较好。采用了这个api.具体介绍请自行baidu, google.

网上有不少例子下载股票历史数据的,但是基本没有完整的代码,特别是C的。这里贴一份完整的。
这里使用了curl的库。
编译:
gcc DownLoadYahoo.c -o yd -lcurl

关键点:
1.这里,Yahoo的api是有一个重定向,所以要设置这个follow action的tag,否则下载下来只是一个重定向的html
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1)

2.目前使用C,貌似只能先把它写入一个文件,并不能写入一个string中。我试过了很多方式,都没有解决。还是因为c里面的char*比起c++的string还是不好用。
写入文件的function用到了curl的回调函数 其原型是
size_t write_func(void *ptr, size_t size, size_t nmemb, void *stream);
这里使用FILE。
这里标记的outfile,就是实际内容将要传入的地方,就是回调函数中的stream. 回调函数中的ptr实际是是stream的位置指针,用于记录当前写入的位置的。
curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
更具体的介绍,请参阅libcurl的wiki.

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <curl/curl.h>

  4. size_t write_func(void *ptr, size_t size, size_t nmemb, FILE *stream);

  5. void DownloadURL(char* url, const char* file);

  6. //callback function for libcurl
  7. size_t write_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
  8. {
  9.      return fwrite(ptr, size, nmemb, stream);
  10. }


  11. void DownloadURL(char* url, const char* file){
  12.     CURL *curl;
  13.     CURLcode res;
  14.     FILE *outfile;
  15.     curl = curl_easy_init();
  16.     if(curl)
  17.     {
  18.         outfile = fopen(file, "w");
  19.         printf ( "downloading the url %s\n", url );
  20. //        char *url = "";
  21.         curl_easy_setopt(curl, CURLOPT_URL, url);
  22.         curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
  23.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
  24.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func);

  25.         res = curl_easy_perform(curl);
  26.         curl_easy_cleanup(curl);
  27.         fclose(outfile);
  28.     }
  29. }



  30. int main(void)
  31. {
  32.     char *url = "";
  33.     DownloadURL(url, "SamplePFYH.csv");

  34. }

阅读(8195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~