1

我打算从这个网站获取数据

http://www.gpw.pl/akcje_i_pda_notowania_ciagle

(这是波兰主要股票市场的网站)

我有一个用 C++ 编写的程序,可以将网站的源代码下载到文件中。但问题是它不包含我感兴趣的东西(当然是股票的价值)。

如果您将此网站源与选项“查看元素”(人民币 -> 查看元素)进行比较,您可以看到“查看元素”确实包含股票的值。

<td>75.6</td>
<tr class="even red">

等等等等……

该站点的下载源没有此信息。

所以我们有2个问题

1) 为什么站点的来源与“查看元素”选项不同?

2)如何传输我的程序以便它可以下载正确的代码?

   #include <string>  
    #include <iostream>  
    #include "curl/curl.h"
    #include <cstdlib>

    using namespace std;  

    // Write any errors in here  
    static char errorBuffer[CURL_ERROR_SIZE];  

    // Write all expected data in here  
    static string buffer;  

    // This is the writer call back function used by curl  
    static int writer(char *data, size_t size, size_t nmemb,  
                      string *buffer)  
    {  
      // What we will return  
      int result = 0;  

      // Is there anything in the buffer?  
      if (buffer != NULL)  
      {  
        // Append the data to the buffer  
        buffer->append(data, size * nmemb);  

        // How much did we write?  
        result = size * nmemb;  
      }  

      return result;  
    }  

    // You know what this does..  
    void usage()  
    {  
      cout <<"curltest: \n" << endl;  
      cout << "Usage:  curltest url\n" << endl;  
    }   

    /* 
     * The old favorite 
     */  
    int main(int argc, char* argv[])  
    {  
      if (argc > 1)  
      {  
        string url(argv[1]);  

        cout<<"Retrieving "<< url << endl;  

        // Our curl objects  
        CURL *curl;  
        CURLcode result;  

        // Create our curl handle  
        curl = curl_easy_init();  

        if (curl)  
        {  
          // Now set up all of the curl options  
          curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);  
          curl_easy_setopt(curl, CURLOPT_URL, argv[1]);  
          curl_easy_setopt(curl, CURLOPT_HEADER, 0);  
          curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  
          curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);  
          curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);  

          // Attempt to retrieve the remote page  
          result = curl_easy_perform(curl);  

          // Always cleanup  
          curl_easy_cleanup(curl);  

          // Did we succeed?  
          if (result == CURLE_OK)  
          {  
            cout << buffer << "\n";  
            exit(0);  
          }  
          else  
          {  
            cout << "Error: [" << result << "] - " << errorBuffer;  
            exit(-1);  
          }  
        }  
      }  
      return 0;
    }  
4

2 回答 2

0

因为这些值是使用 JavaScript 填充的。

“查看源代码”向您显示页面的原始源代码,而“查看元素”向您显示文档树目前的状态。

没有简单的方法可以修复它,因为您需要执行 JavaScript 或将其移植到 C++(这可能会让您在交易所不受欢迎)。

于 2013-05-31T12:26:27.203 回答
0

当我将页面保存为 html 文件(文件/另存为)时,我得到一个文件,其中包含浏览器中显示的所有数据,并且在页面源中找不到(我使用 Chrome)。

所以我建议您在代码中添加一个步骤:

  1. 从支持命令行或某种 API 的启用 javascript 的浏览器下载页面(如果 curl 无法做到,也许 wget 或 lynx/links/links2/elinks on linux 可以帮助您?)。
  2. 解析数据。
于 2013-05-31T12:37:43.303 回答