历史数据源的问题查了很久,一个是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.
- #include <stdio.h>
- #include <stdlib.h>
- #include <curl/curl.h>
- size_t write_func(void *ptr, size_t size, size_t nmemb, FILE *stream);
- void DownloadURL(char* url, const char* file);
- //callback function for libcurl
- size_t write_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
- {
- return fwrite(ptr, size, nmemb, stream);
- }
- void DownloadURL(char* url, const char* file){
- CURL *curl;
- CURLcode res;
- FILE *outfile;
- curl = curl_easy_init();
- if(curl)
- {
- outfile = fopen(file, "w");
- printf ( "downloading the url %s\n", url );
- // char *url = "";
- curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, outfile);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_func);
- res = curl_easy_perform(curl);
- curl_easy_cleanup(curl);
- fclose(outfile);
- }
- }
- int main(void)
- {
- char *url = "";
- DownloadURL(url, "SamplePFYH.csv");
- }
阅读(8291) | 评论(0) | 转发(0) |